Beispiel #1
0
void serverms(int mode, int numplayers, int minremain, char *smapname, int seconds, bool isfull) {
  checkmasterreply();
  updatemasterserver(seconds);

  // reply all server info requests
  ENetBuffer buf;
  ENetAddress addr;
  u8 pong[MAXTRANS], *p;
  int len;
  enet_uint32 events = ENET_SOCKET_WAIT_RECEIVE;
  buf.data = pong;
  while (enet_socket_wait(pongsock, &events, 0) >= 0 && events) {
    buf.dataLength = sizeof(pong);
    len = enet_socket_receive(pongsock, &addr, &buf, 1);
    if (len < 0) return;
    p = &pong[len];
    putint(p, PROTOCOL_VERSION);
    putint(p, mode);
    putint(p, numplayers);
    putint(p, minremain);
    string mname;
    strcpy_s(mname, isfull ? "[FULL] " : "");
    strcat_s(mname, smapname);
    sendstring(mname, p);
    sendstring(serverdesc, p);
    buf.dataLength = p - pong;
    enet_socket_send(pongsock, &addr, &buf, 1);
  }
}
		void BroadcastHost::update()
		{
			int length;
			ENetAddress addr;
			ENetBuffer bcbuffer;
			bcbuffer.data = new char[1024];
			bcbuffer.dataLength = 1024;
			// Look for broadcast messages
			while ((length = enet_socket_receive(bcastsocket, &addr, &bcbuffer, 1))
				!= 0)
			{
				if (length < 0)
				{
					std::cout << "Socket error: " << errno << std::endl;
					break;
				}
				else
				{
					// Send answer
					ENetBuffer replybuffer;
					if (reply)
					{
						replybuffer.data = reply->getData();
						replybuffer.dataLength = reply->getSize();
					}
					else
					{
						replybuffer.data = (void*)"PONG";
						replybuffer.dataLength = 5;
					}
					enet_socket_send(bcastsocket, &addr, &replybuffer, 1);
				}
			}
			delete[] (char*)bcbuffer.data;
		}
Beispiel #3
0
void httpgetrecieve(ENetBuffer &buf) {
  if (mssock==ENET_SOCKET_NULL)
    return;
  enet_uint32 events = ENET_SOCKET_WAIT_RECEIVE;
  if (enet_socket_wait(mssock, &events, 0) >= 0 && events) {
    int len = enet_socket_receive(mssock, NULL, &buf, 1);
    if (len<=0) {
      enet_socket_destroy(mssock);
      mssock = ENET_SOCKET_NULL;
      return;
    }
    buf.data = ((char *)buf.data)+len;
    ((char*)buf.data)[0] = 0;
    buf.dataLength -= len;
  }
}
Beispiel #4
0
static int
enet_protocol_receive_incoming_commands (ENetHost * host, ENetEvent * event)
{
    for (;;)
    {
       int receivedLength;
       ENetBuffer buffer;

       buffer.data = host -> receivedData;
       buffer.dataLength = sizeof (host -> receivedData);

       receivedLength = enet_socket_receive (host -> socket,
                                             & host -> receivedAddress,
                                             & buffer,
                                             1);

       if (receivedLength < 0)
         return -1;

       if (receivedLength == 0)
         return 0;

       host -> receivedDataLength = receivedLength;

       switch (enet_protocol_handle_incoming_commands (host, event))
       {
       case 1:
          return 1;

       case -1:
          return -1;

       default:
          break;
       }
    }

    return -1;
}
void LANGameFinderAndAnnouncer::receivePackets() {
	NetworkPacket_AnnounceGame announcePacket;

	ENetAddress senderAddress;

	ENetBuffer enetBuffer;
	enetBuffer.data = &announcePacket;
	enetBuffer.dataLength = sizeof(announcePacket);
	int receivedBytes = enet_socket_receive(announceSocket, &senderAddress, &enetBuffer, 1);
	if(receivedBytes==0) {
		// blocked
	} else if(receivedBytes < 0) {
		throw std::runtime_error("LANGameFinderAndAnnouncer: Receiving data failed!");
	} else {
		if((receivedBytes == sizeof(NetworkPacket_AnnounceGame))
			&& (SDL_SwapLE32(announcePacket.magicNumber) == LANGAME_ANNOUNCER_MAGICNUMBER)
			&& (announcePacket.type == NETWORKPACKET_ANNOUNCEGAME)
            && (strncmp(announcePacket.serverVersion, VERSIONSTRING, LANGAME_ANNOUNCER_MAXGAMEVERSIONSIZE) == 0)) {

			std::string serverName = std::string(announcePacket.serverName, LANGAME_ANNOUNCER_MAXGAMENAMESIZE);
			serverName.resize(strlen(serverName.c_str()));  // strip off '\0' at the end of the std::string
			int serverPort = SDL_SwapLE16(announcePacket.serverPort);

			std::string mapName = std::string(announcePacket.mapName, LANGAME_ANNOUNCER_MAXMAPNAMESIZE);
			mapName.resize(strlen(mapName.c_str()));  // strip off '\0' at the end of the std::string

			int numPlayers = announcePacket.numPlayers;
			int maxPlayers = announcePacket.maxPlayers;

			GameServerInfo gameServerInfo;
			gameServerInfo.serverAddress.host = senderAddress.host;
			gameServerInfo.serverAddress.port = serverPort;
			gameServerInfo.serverName = serverName;
			gameServerInfo.mapName = mapName;
			gameServerInfo.numPlayers = numPlayers;
			gameServerInfo.maxPlayers = maxPlayers;
			gameServerInfo.bPasswordProtected = false;
			gameServerInfo.lastUpdate = SDL_GetTicks();

			bool bUpdate = false;
			std::list<GameServerInfo>::iterator iter;
			for(iter = gameServerInfoList.begin(); iter != gameServerInfoList.end(); ++iter) {
				if((iter->serverAddress.host == gameServerInfo.serverAddress.host)
					&& (iter->serverAddress.port == gameServerInfo.serverAddress.port)) {
					*iter = gameServerInfo;
					bUpdate = true;
					break;
				}

			}

			if(bUpdate) {
			    if(pOnUpdateServer) {
                    pOnUpdateServer(gameServerInfo);
			    }
			} else {
				gameServerInfoList.push_back(gameServerInfo);
				if(pOnNewServer) {
                    pOnNewServer(gameServerInfo);
				}
			}
		} else if((receivedBytes == sizeof(NetworkPacket_RemoveGameAnnouncement))
			&& (SDL_SwapLE32(announcePacket.magicNumber) == LANGAME_ANNOUNCER_MAGICNUMBER)
			&& (announcePacket.type == NETWORKPACKET_REMOVEGAMEANNOUNCEMENT)) {

			int serverPort = SDL_SwapLE16(announcePacket.serverPort);

			std::list<GameServerInfo>::iterator iter = gameServerInfoList.begin();
			while(iter != gameServerInfoList.end()) {
				if((iter->serverAddress.host == senderAddress.host)
					&& (iter->serverAddress.port == serverPort)) {
					GameServerInfo tmpGameServerInfo = *iter;
					iter = gameServerInfoList.erase(iter);

                    if(pOnRemoveServer) {
                        pOnRemoveServer(tmpGameServerInfo);
                    }
				} else {
					++iter;
				}
			}
		} else if((serverPort > 0)
			&& (receivedBytes == sizeof(NetworkPacket_RequestGame))
			&& (SDL_SwapLE32(announcePacket.magicNumber) == LANGAME_ANNOUNCER_MAGICNUMBER)
			&& (announcePacket.type == NETWORKPACKET_REQUESTANNOUNCE)) {

			announceGame();
		}

	}
}