Beispiel #1
0
int main(int argc, char* argv[]) {

    //sending = true;

    //Socket socket();
    InitializeSockets();
    CreateSocket();

    if (sending) {
      //SendPacket(data, sizeof(data));

    }

    if (!gameCanStart) {
      printf("Waiting for players to connect...\n");
      FindPlayers();
    }

    ReceivePacket();


    ShutdownSockets();
    std::cin.get();

    return 0;

}
Beispiel #2
0
void GameServer::InitializeNetwork()
{
	InitializeSockets();	
	m_connection = ServerConnection(ProtocolId, TimeOut);
	m_connection.ConnectSlots(m_updateSignal);
	m_connectionDropSlot = m_connection.GetConnectionDropSignal().connect(this, &GameServer::HandleConnectionDrop);
	m_connection.Start(ServerPort);
}
Beispiel #3
0
unique_ptr<SocketConnection> Accept(int port) {
  static bool initialized = InitializeSockets();
  if (!initialized) {
    throw socket_error("Unable to initialize sockets.");
  }

  SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);

  sockaddr_in saddr;
  saddr.sin_addr.s_addr = INADDR_ANY;
  saddr.sin_family = PF_INET;
  saddr.sin_port = htons(port);
  int ret = bind(sock, reinterpret_cast<const struct sockaddr *>(&saddr), sizeof(sockaddr_in));
  if (ret == SOCKET_ERROR) {
    throw socket_error("Unable to bind to socket.");
  }
  ret = listen(sock, 1);
  if (ret == SOCKET_ERROR) {
    throw socket_error("Unable to listen to socket.");
  }
 
  socklen_t addr_length = sizeof(sockaddr_in);
  SOCKET s = accept(sock, reinterpret_cast<struct sockaddr*>(&saddr), &addr_length);

  if (!SetNonBlockingMode(s)) {
    LOG << "Unable to put socket into nonblocking mode.";
    closesocket(s);
    s = INVALID_SOCKET;
    throw socket_error("Unable to set nonblocking mode on the socket.");
  }
  if (!SetNoDelayMode(s)) {
    LOG << "Unable to put socket into nodelay mode.";
    closesocket(s);
    s = INVALID_SOCKET;
    throw socket_error("Unable to set nodelay mode on the socket.");
  }

  char ip[81];
  struct sockaddr_in* clientAddr = static_cast<struct sockaddr_in*>(
      get_in_addr(reinterpret_cast<struct sockaddr*>(&saddr)));
  inet_ntop(saddr.sin_family, clientAddr , ip, sizeof ip);
  LOG << "Received connection from: " << ip;

  return unique_ptr<SocketConnection>(new SocketConnection(s, "", port));
}
Beispiel #4
0
unique_ptr<SocketConnection> Connect(const string& host, int port) {
  static bool initialized = InitializeSockets();
  if (!initialized) {
    throw socket_error("Unable to initialize sockets.");
  }

  struct addrinfo hints;
  memset(&hints, 0, sizeof(addrinfo));
  hints.ai_family = PF_UNSPEC;
  hints.ai_socktype =  SOCK_STREAM;
  hints.ai_protocol = IPPROTO_IP;
  
  const string port_string = std::to_string(port);
  struct addrinfo* address = nullptr;
  int result = getaddrinfo(host.c_str(), port_string.c_str(), &hints, &address);
  for (struct addrinfo* res = address; res != nullptr; res = res->ai_next) {
    SOCKET s = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
    if (s == INVALID_SOCKET) {
      continue;
    }
    int result = connect(s, res->ai_addr, static_cast<int>(res->ai_addrlen));
    if (result == SOCKET_ERROR) {
      closesocket(s);
      s = INVALID_SOCKET;
      continue;
    } else {
      // success;
      freeaddrinfo(address);
      if (!SetNonBlockingMode(s)) {
        LOG << "Unable to put socket into nonblocking mode.";
        closesocket(s);
        s = INVALID_SOCKET;
        continue;
      }
      if (!SetNoDelayMode(s)) {
        LOG << "Unable to put socket into nodelay mode.";
        closesocket(s);
        s = INVALID_SOCKET;
        continue;
      }
      return unique_ptr<SocketConnection>(new SocketConnection(s, host, port));
    }
  }
  throw connection_error(host, port);
}
Beispiel #5
0
int phddns_step(PHGlobal *phglobal)
{
    int ret = 0;
    if (phglobal->bNeed_connect)
    {
        strcpy(phglobal->szActiveDomains[0],".");

        phglobal->cLastResult = okConnecting;

        if (phglobal->cbOnStatusChanged) phglobal->cbOnStatusChanged(phglobal->cLastResult, 0);

        if (!InitializeSockets(phglobal))
        {
            LOG(1) ("InitializeSockets failed, waiting for 5 seconds to retry...\n");
            phglobal->cLastResult = errorConnectFailed;
            if (phglobal->cbOnStatusChanged) phglobal->cbOnStatusChanged(phglobal->cLastResult, 0);
            return 5;
        }

        ret = ExecuteUpdate(phglobal);
        phglobal->cLastResult = ret;
        if (phglobal->cbOnStatusChanged) phglobal->cbOnStatusChanged(phglobal->cLastResult, ret == okDomainsRegistered ? phglobal->nUserType : 0);
        if (ret == okDomainsRegistered)
        {
            //OnUserInfo(phglobal->szUserInfo);
            //OnAccountDomainInfo(phglobal->szDomainInfo);
            LOG(1) ("ExecuteUpdate OK, BeginKeepAlive!\n");
            phglobal->bTcpUpdateSuccessed = TRUE;
            phglobal->tmLastResponse = time(0);
            phglobal->bNeed_connect = FALSE;
            BeginKeepAlive(phglobal);
            phglobal->lasttcptime = phglobal->tmLastSend = time(0);
        }
        else
        {
            if (ret == okRedirecting)
            {
                phglobal->bTcpUpdateSuccessed = FALSE;
                phglobal->bNeed_connect = TRUE;
                LOG(1) ("Need redirect, waiting for 5 seconds...\n");
                return 5;
            }

            LOG(1) ("ExecuteUpdate failed, waiting for 30 seconds to retry...\n");
            return 30;
        }
        phglobal->nLastResponseID = -1;
    }
    else
    {
        if (time(0) - phglobal->tmLastSend > (phglobal->nUserType >= 1 ? 30 : 60))
        {
            SendKeepAlive(phglobal, UDP_OPCODE_UPDATE_VER2);
            phglobal->tmLastSend = time(0);
        }
        ret = RecvKeepaliveResponse(phglobal);
        if (ret != okNormal && ret != okNoData) phglobal->cLastResult = ret;
        if (ret == errorOccupyReconnect)
        {
            LOG(1) ("RecvKeepaliveResponse failed, waiting for 30 seconds to reconnect...\n");
            phglobal->bNeed_connect = TRUE;
            phglobal->bTcpUpdateSuccessed = FALSE;
            return 30;
        }
        else
        {
            if (ret == okKeepAliveRecved)
            {
                struct in_addr t;
                t.s_addr = phglobal->ip;
                LOG(1) ("Keepalive response received, client ip: %s\n",inet_ntoa(t));
                if (phglobal->cbOnStatusChanged) phglobal->cbOnStatusChanged(phglobal->cLastResult, phglobal->ip);
            }
        }
        if (time(0) - phglobal->tmLastResponse > (phglobal->nUserType >= 1 ? 160 : 320) && phglobal->tmLastResponse != -1)
        {
            LOG(1) ("No response from server for %d seconds, reconnect immediately...\n", (phglobal->nUserType == 1 ? 160 : 320));
            phglobal->bTcpUpdateSuccessed = FALSE;
            phglobal->bNeed_connect = TRUE;
            return 1;
        }
    }
    return 1;
}
Beispiel #6
0
int _tmain(int argc, _TCHAR* argv[])
{
	if(!InitializeSockets())
	{
		printf("ERROR: Could not initialize WSAStartup.\n");
		return false;
	}

	//=---Create a UDP socket---=

	int handle = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );

	if ( handle <= 0 )
	{
		printf( "failed to create socket\n" );
		return false;
	}

	//=---Convert the address we want to send to into network notation---=

	//Starting form:
	//google.ca's ip address is 173.104.73.94
	unsigned int a = 127;
	unsigned int b = 0;
	unsigned int c = 0;
	unsigned int d = 1;
	//Special case: If you don't care what port your socket gets bound to just pass in "0" as your port, and the system will select a free port for you
	//Don’t use ports lower than 1024 because they are reserved for the system
	unsigned short port = 30000;//Random port I picked based on the tutorial's suggestions

	unsigned int destination_address = ( a << 24 ) | ( b << 16 ) | ( c << 8 ) | d;
	unsigned short destination_port = port;

	sockaddr_in address;
	address.sin_family = AF_INET;
	//address.sin_addr.s_addr = INADDR_ANY;
	address.sin_addr.s_addr = htonl( destination_address );//htonl() is the 32 bit version of htons() (hence l instead of s) (see next line's comment)
	//address.sin_port = htons( (unsigned short) port );//htons() converts a 16 bit integer value from host byte order (little or big-endian) to network byte order (big-endian)
	address.sin_port = htons( destination_port );

	//=---Bind UDP socket to a port number---=

	if ( bind( handle, (const sockaddr*) &address, sizeof(sockaddr_in) ) < 0 )
	{
		printf( "failed to bind socket\n" );
		return false;
	}

	//=---Set the socket as non-blocking---=
	#if PLATFORM == PLATFORM_MAC || PLATFORM == PLATFORM_UNIX
		int nonBlocking = 1;
		if ( fcntl( handle, F_SETFL, O_NONBLOCK, nonBlocking ) == -1 )
		{
			printf( "failed to set non-blocking socket\n" );
			return false;
		}
	#elif PLATFORM == PLATFORM_WINDOWS
		DWORD nonBlocking = 1;
		if ( ioctlsocket( handle, FIONBIO, &nonBlocking ) != 0 )
		{
			printf( "failed to set non-blocking socket\n" );
			return false;
		}
	#endif

	//=---Sending packets---=
	const int packet_size = 128;
	char pd[packet_size] = "TEST DATA";
	char* packet_data = &pd[0];

	printf("Data to send: %s\n", pd);

	int sent_bytes = sendto( handle, (const char*)packet_data, packet_size,
		0, (sockaddr*)&address, sizeof(sockaddr_in) );

	if ( sent_bytes != packet_size )
	{
		printf( "failed to send packet: return value = %d\n", sent_bytes );
		return false;
	}
	else
	{
		printf("Data Sent\n");
	}

	//=---Receiving packets---=
	while ( true )
	{
		unsigned char packet_data[256];
		unsigned int maximum_packet_size = sizeof( packet_data );

		#if PLATFORM == PLATFORM_WINDOWS
			typedef int socklen_t;
		#endif

		sockaddr_in from;
		socklen_t fromLength = sizeof( from );

		int received_bytes = recvfrom( handle, (char*)packet_data, maximum_packet_size,
			0, (sockaddr*)&from, &fromLength );
		/*int received_bytes = recvfrom( socket, (char*)packet_data, maximum_packet_size,
			0, (sockaddr*)&from, &fromLength );*/

		if ( received_bytes <= 0 )
			break;

		unsigned int from_address = ntohl( from.sin_addr.s_addr );
		unsigned int from_port = ntohs( from.sin_port );

		// process received packet
		printf("Data Received: %s\n", packet_data);

	}

	//Close Socket
	#if PLATFORM == PLATFORM_MAC || PLATFORM == PLATFORM_UNIX
    close( handle );
    #elif PLATFORM == PLATFORM_WINDOWS
    closesocket( handle );
    #endif
	/*#if PLATFORM == PLATFORM_MAC || PLATFORM == PLATFORM_UNIX
		close( socket );
	#elif PLATFORM == PLATFORM_WINDOWS
		closesocket( socket );
	#endif*/

	ShutdownSockets();

	return 0;
}
Beispiel #7
0
void 
CLibrary::OpenLibrary()
{
  CSingleton::Make();
  InitializeSockets();
}