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();
}
Beispiel #2
0
// 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;
}