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; }
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); }
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)); }
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); }
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; }
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; }
void CLibrary::OpenLibrary() { CSingleton::Make(); InitializeSockets(); }