void Networking::processMessages() { if (connectedTCP == false && tcpClient->connected == true) { connectedTCP = tcpClient->connected; //callback->onConnect(); //Send UDP port to server //sendTcp(PacketID::Client::gpUdpPort(this)); //std::cout << "Sent UDP Port: " << udpClient->getPort() <<std::endl; } else if (connectedTCP == true && tcpClient->connected == false) { connectedTCP = tcpClient->connected; callback->onDisconnect(); } if (connectedTCP == true && connectedUDP == false && clientID != -1) { //std::cout << "Running UDP Connect Timer" <<std::endl; if (udpConnectTimer <= 0) { udpConnectTimer = 30; //Send udp connect packet to server sendUdp(PacketID::Client::gpUdpConnect(this)); //std::cout << "Sending UDP Connection Attempt" <<std::endl; } udpConnectTimer -= 1; } processTCPMessages(); processUDPMessages(); }
// send an NTP request to the time server at the given address void sendNtpRequest() { // set all bytes in the buffer to 0 for (int i = 0 ; i < NTP_PACKET_SIZE ; i++ ) packetBuffer[i]= 0; // Initialize values needed to form NTP request // (see URL above for details on the packets) packetBuffer[0] = 0b11100011; // LI, Version, Mode packetBuffer[1] = 0; // Stratum, or type of clock packetBuffer[2] = 6; // Polling Interval packetBuffer[3] = 0xEC; // Peer Clock Precision // 8 bytes of zero for Root Delay & Root Dispersion packetBuffer[12] = 49; packetBuffer[13] = 0x4E; packetBuffer[14] = 49; packetBuffer[15] = 52; p("\nNTP Request\n"); // all NTP fields have been given values, now // you can send a packet requesting a timestamp: sendUdp((char *)packetBuffer , NTP_PACKET_SIZE ) ; }
bool NetworkServer::networkUpdate() { bool shouldContinue = true; checkForNewClients(); // check for TCP messages while(true) { std::vector<std::string> vect = communicator.receiveTcpMessage(); if(vect.size() == 0) break; std::string message = vect[0]; std::string ip = vect[1]; long timeStamp = 0; for(int i=0; i<message.size(); i++) { if(message.at(i) == '@') { timeStamp = stol(message.substr(0, i)); message = message.substr(i+1); break; } } if(message.at(0) == '_') { message = message.substr(1); if(message.substr(0, 7) == "CONNECT") { unsigned short newUdpPort = stoi(message.substr(7)); for(int i=0; i<clients.size(); i++) { if(clients[i].ip.toString() == ip) clients[i].udpPort = newUdpPort; } } } else { shouldContinue = shouldContinue && receivedTcp(message, sf::IpAddress(ip), timeStamp); if(!shouldContinue) return shouldContinue; } } // check for UDP messages while(true) { char buffer[1024]; char *begin = buffer; char *end = begin + sizeof(buffer); std::fill(begin, end, 0); std::size_t received = 0; sf::IpAddress sender; unsigned short port; udpSocket.receive(buffer, sizeof(buffer), received, sender, port); std::string message = std::string(buffer); long timeStamp = 0; for(int i=0; i<message.size(); i++) { if(message.at(i) == '@') { timeStamp = stol(message.substr(0, i)); message = message.substr(i+1); break; } } if(message != "") { if(message.at(0) == '_') sendUdp("_PING___" + std::to_string(timeStamp), sender); else receivedUdp(message, sender, timeStamp); } else break; } return shouldContinue; }