//***************************************************************************** // void SERVER_MASTER_Broadcast( void ) { netadr_t AddressBroadcast; sockaddr_in broadcast_addr; // Send an update to the master server every second. if ( gametic % TICRATE ) return; // User doesn't wish to broadcast this server. if (( sv_broadcast == false ) || Args.CheckParm( "-nobroadcast" )) return; // NETWORK_ClearBuffer( &g_MasterServerBuffer ); broadcast_addr.sin_family = AF_INET; broadcast_addr.sin_addr.s_addr = INADDR_BROADCAST; broadcast_addr.sin_port = htons( DEFAULT_BROADCAST_PORT ); NETWORK_SocketAddressToNetAddress( &broadcast_addr, &AddressBroadcast ); // Broadcast our packet. SERVER_MASTER_SendServerInfo( AddressBroadcast, SQF_ALL, 0 ); // NETWORK_WriteLong( &g_MasterServerBuffer, MASTER_CHALLENGE ); // NETWORK_LaunchPacket( g_MasterServerBuffer, AddressBroadcast, true ); }
//***************************************************************************** // bool NETWORK_StringToAddress( const char *s, NETADDRESS_s *a ) { struct hostent *h; struct sockaddr_in sadr; char *colon; char copy[512]; memset (&sadr, 0, sizeof(sadr)); sadr.sin_family = AF_INET; sadr.sin_port = 0; strncpy (copy, s, 512-1); copy[512-1] = 0; // strip off a trailing :port if present for (colon = copy ; *colon ; colon++) { if (*colon == ':') { *colon = 0; sadr.sin_port = htons(atoi(colon+1)); break; } } { const ULONG ulRet = inet_addr( copy ); // If our return value is INADDR_NONE, the IP specified is not a valid IPv4 string. if ( ulRet == INADDR_NONE ) { // If the string cannot be resolved to a valid IP address, return false. if (( h = gethostbyname( copy )) == NULL ) return ( false ); *(int *)&sadr.sin_addr = *(int *)h->h_addr_list[0]; } else *(int *)&sadr.sin_addr = ulRet; } NETWORK_SocketAddressToNetAddress (&sadr, a); return true; }
//***************************************************************************** // int NETWORK_GetLANPackets( void ) { // [BB] If we know that there is a problem with the socket don't try to use it. if ( g_bLANSocketInvalid ) return 0; LONG lNumBytes; INT iDecodedNumBytes; struct sockaddr_in SocketFrom; INT iSocketFromLength; iSocketFromLength = sizeof( SocketFrom ); #ifdef WIN32 lNumBytes = recvfrom( g_LANSocket, (char *)g_ucHuffmanBuffer, sizeof( g_ucHuffmanBuffer ), 0, (struct sockaddr *)&SocketFrom, &iSocketFromLength ); #else lNumBytes = recvfrom( g_LANSocket, (char *)g_ucHuffmanBuffer, sizeof( g_ucHuffmanBuffer ), 0, (struct sockaddr *)&SocketFrom, (socklen_t *)&iSocketFromLength ); #endif // If the number of bytes returned is -1, an error has occured. if ( lNumBytes == -1 ) { #ifdef __WIN32__ errno = WSAGetLastError( ); if ( errno == WSAEWOULDBLOCK ) return ( false ); // Connection reset by peer. Doesn't mean anything to the server. if ( errno == WSAECONNRESET ) return ( false ); if ( errno == WSAEMSGSIZE ) { Printf( "NETWORK_GetPackets: WARNING! Oversize packet from %s\n", NETWORK_AddressToString( g_AddressFrom )); return ( false ); } Printf( "NETWORK_GetPackets: WARNING!: Error #%d: %s\n", errno, strerror( errno )); return ( false ); #else if ( errno == EWOULDBLOCK ) return ( false ); if ( errno == ECONNREFUSED ) return ( false ); Printf( "NETWORK_GetPackets: WARNING!: Error #%d: %s\n", errno, strerror( errno )); return ( false ); #endif } // No packets or an error, dont process anything. if ( lNumBytes <= 0 ) return ( 0 ); // Record this for our statistics window. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVER_STATISTIC_AddToInboundDataTransfer( lNumBytes ); // If the number of bytes we're receiving exceeds our buffer size, ignore the packet. if ( lNumBytes >= static_cast<LONG>(g_NetworkMessage.ulMaxSize) ) return ( 0 ); // Decode the huffman-encoded message we received. HUFFMAN_Decode( g_ucHuffmanBuffer, (unsigned char *)g_NetworkMessage.pbData, lNumBytes, &iDecodedNumBytes ); g_NetworkMessage.ulCurrentSize = iDecodedNumBytes; g_NetworkMessage.ByteStream.pbStream = g_NetworkMessage.pbData; g_NetworkMessage.ByteStream.pbStreamEnd = g_NetworkMessage.ByteStream.pbStream + g_NetworkMessage.ulCurrentSize; // Store the IP address of the sender. NETWORK_SocketAddressToNetAddress( &SocketFrom, &g_AddressFrom ); return ( g_NetworkMessage.ulCurrentSize ); }