qboolean Sys_StringToSockaddr(const char *s, struct sockaddr *sadr) { struct hostent *h; int val; char copy[MAX_STRING_CHARS]; memset(sadr, 0, sizeof(*sadr)); // check for an IPX address // rain - too easy to falsely match a real hostname // if( ( strlen( s ) == 21 ) && ( s[8] == '.' ) ) { if(NET_IsIPXAddress(s)) { ((struct sockaddr_ipx *)sadr)->sa_family = AF_IPX; ((struct sockaddr_ipx *)sadr)->sa_socket = 0; copy[2] = 0; DO(0, sa_netnum[0]); DO(2, sa_netnum[1]); DO(4, sa_netnum[2]); DO(6, sa_netnum[3]); DO(9, sa_nodenum[0]); DO(11, sa_nodenum[1]); DO(13, sa_nodenum[2]); DO(15, sa_nodenum[3]); DO(17, sa_nodenum[4]); DO(19, sa_nodenum[5]); } else { ((struct sockaddr_in *)sadr)->sin_family = AF_INET; ((struct sockaddr_in *)sadr)->sin_port = 0; if(s[0] >= '0' && s[0] <= '9') { *(int *)&((struct sockaddr_in *)sadr)->sin_addr = inet_addr(s); } else { if((h = gethostbyname(s)) == 0) { return 0; } *(int *)&((struct sockaddr_in *)sadr)->sin_addr = *(int *)h->h_addr_list[0]; } } return qtrue; }
qboolean Sys_StringToSockaddr( const char *s, struct sockaddr *sadr ) { struct hostent *h; int val; char copy[MAX_STRING_CHARS]; memset( sadr, 0, sizeof( *sadr ) ); // check for an IPX address #if !defined RTCW_ET if ( ( strlen( s ) == 21 ) && ( s[8] == '.' ) ) { #else // rain - too easy to falsely match a real hostname // if( ( strlen( s ) == 21 ) && ( s[8] == '.' ) ) { if ( NET_IsIPXAddress( s ) ) { #endif // RTCW_XX ( (struct sockaddr_ipx *)sadr )->sa_family = AF_IPX; ( (struct sockaddr_ipx *)sadr )->sa_socket = 0; copy[2] = 0; DO( 0, sa_netnum[0] ); DO( 2, sa_netnum[1] ); DO( 4, sa_netnum[2] ); DO( 6, sa_netnum[3] ); DO( 9, sa_nodenum[0] ); DO( 11, sa_nodenum[1] ); DO( 13, sa_nodenum[2] ); DO( 15, sa_nodenum[3] ); DO( 17, sa_nodenum[4] ); DO( 19, sa_nodenum[5] ); } else { ( (struct sockaddr_in *)sadr )->sin_family = AF_INET; ( (struct sockaddr_in *)sadr )->sin_port = 0; #if defined RTCW_SP if ( Q_isnumeric( s[0] ) ) { #else if ( s[0] >= '0' && s[0] <= '9' ) { #endif // RTCW_XX *(int *)&( (struct sockaddr_in *)sadr )->sin_addr = inet_addr( s ); } else { if ( ( h = gethostbyname( s ) ) == 0 ) { return 0; } *(int *)&( (struct sockaddr_in *)sadr )->sin_addr = *(int *)h->h_addr_list[0]; } } return qtrue; } #undef DO /* ============= Sys_StringToAdr idnewt 192.246.40.70 ============= */ qboolean Sys_StringToAdr( const char *s, netadr_t *a ) { struct sockaddr sadr; if ( !Sys_StringToSockaddr( s, &sadr ) ) { return qfalse; } SockadrToNetadr( &sadr, a ); return qtrue; } //============================================================================= /* ================== Sys_GetPacket Never called by the game logic, just the system event queing ================== */ int recvfromCount; qboolean Sys_GetPacket( netadr_t *net_from, msg_t *net_message ) { int ret; struct sockaddr from; int fromlen; int net_socket; int protocol; int err; for ( protocol = 0 ; protocol < 2 ; protocol++ ) { if ( protocol == 0 ) { net_socket = ip_socket; } else { net_socket = ipx_socket; } if ( !net_socket ) { continue; } fromlen = sizeof( from ); recvfromCount++; // performance check ret = recvfrom( net_socket, reinterpret_cast<char*> (net_message->data), net_message->maxsize, 0, (struct sockaddr *)&from, &fromlen ); if ( ret == SOCKET_ERROR ) { err = WSAGetLastError(); if ( err == WSAEWOULDBLOCK || err == WSAECONNRESET ) { continue; } Com_Printf( "NET_GetPacket: %s\n", NET_ErrorString() ); continue; } if ( net_socket == ip_socket ) { memset( ( (struct sockaddr_in *)&from )->sin_zero, 0, 8 ); } if ( usingSocks && net_socket == ip_socket && memcmp( &from, &socksRelayAddr, fromlen ) == 0 ) { if ( ret < 10 || net_message->data[0] != 0 || net_message->data[1] != 0 || net_message->data[2] != 0 || net_message->data[3] != 1 ) { continue; } net_from->type = NA_IP; net_from->ip[0] = net_message->data[4]; net_from->ip[1] = net_message->data[5]; net_from->ip[2] = net_message->data[6]; net_from->ip[3] = net_message->data[7]; net_from->port = *(short *)&net_message->data[8]; net_message->readcount = 10; } else { SockadrToNetadr( &from, net_from ); net_message->readcount = 0; } if ( ret == net_message->maxsize ) { Com_Printf( "Oversize packet from %s\n", NET_AdrToString( *net_from ) ); continue; } net_message->cursize = ret; return qtrue; } return qfalse; } //============================================================================= static char socksBuf[4096]; /* ================== Sys_SendPacket ================== */ void Sys_SendPacket( int length, const void *data, netadr_t to ) { int ret; struct sockaddr addr; SOCKET net_socket; if ( to.type == NA_BROADCAST ) { net_socket = ip_socket; } else if ( to.type == NA_IP ) { net_socket = ip_socket; } else if ( to.type == NA_IPX ) { net_socket = ipx_socket; } else if ( to.type == NA_BROADCAST_IPX ) { net_socket = ipx_socket; } else { Com_Error( ERR_FATAL, "Sys_SendPacket: bad address type" ); return; } if ( !net_socket ) { return; } NetadrToSockadr( &to, &addr ); if ( usingSocks && to.type == NA_IP ) { socksBuf[0] = 0; // reserved socksBuf[1] = 0; socksBuf[2] = 0; // fragment (not fragmented) socksBuf[3] = 1; // address type: IPV4 *(int *)&socksBuf[4] = ( (struct sockaddr_in *)&addr )->sin_addr.s_addr; *(short *)&socksBuf[8] = ( (struct sockaddr_in *)&addr )->sin_port; memcpy( &socksBuf[10], data, length ); ret = sendto( net_socket, socksBuf, length + 10, 0, &socksRelayAddr, sizeof( socksRelayAddr ) ); } else { ret = sendto( net_socket, static_cast<const char*> (data), length, 0, &addr, sizeof( addr ) ); } if ( ret == SOCKET_ERROR ) { int err = WSAGetLastError(); // wouldblock is silent if ( err == WSAEWOULDBLOCK ) { return; } // some PPP links do not allow broadcasts and return an error if ( ( err == WSAEADDRNOTAVAIL ) && ( ( to.type == NA_BROADCAST ) || ( to.type == NA_BROADCAST_IPX ) ) ) { return; } Com_Printf( "NET_SendPacket: %s\n", NET_ErrorString() ); } }