Beispiel #1
0
unsigned short GetPort(const netadr_t& address)
{
    if ( address.type == netadrtype_t::NA_IP_DUAL )
    {
        if ( NET_IS_IPv4( address.type ) )
        {
            return address.port4;
        }
        else if ( NET_IS_IPv6( address.type ) )
        {
            return address.port6;
        }
    }
    return address.port;
}
Beispiel #2
0
const char      *NET_AdrToStringwPort( netadr_t a )
{
	static  char s[ NET_ADDR_W_PORT_STR_MAX_LEN ];

	if ( a.type == NA_LOOPBACK )
	{
		Com_sprintf( s, sizeof( s ), "loopback" );
	}
	else if ( a.type == NA_BOT )
	{
		Com_sprintf( s, sizeof( s ), "bot" );
	}
	else if ( NET_IS_IPv4( a.type ) )
	{
		Com_sprintf( s, sizeof( s ), "%s:%hu", NET_AdrToString( a ), ntohs( a.type == NA_IP_DUAL ? a.port4 : a.port ) );
	}
	else if ( NET_IS_IPv6( a.type ) )
	{
		Com_sprintf( s, sizeof( s ), "[%s]:%hu", NET_AdrToString( a ), ntohs( a.type == NA_IP_DUAL ? a.port6 : a.port ) );
	}
	return s;
}
Beispiel #3
0
/*
==================
Sys_SendPacket
==================
*/
void Sys_SendPacket( int length, const void *data, netadr_t to )
{
	int                     ret = SOCKET_ERROR;
	struct sockaddr_storage addr;

	if ( to.type != NA_BROADCAST && to.type != NA_IP && to.type != NA_IP_DUAL && to.type != NA_IP6 && to.type != NA_MULTICAST6 )
	{
		Com_Error( ERR_FATAL, "Sys_SendPacket: bad address type" );
	}

	if ( ( ip_socket == INVALID_SOCKET && NET_IS_IPv4( to.type ) ) ||
	     ( ip_socket == INVALID_SOCKET && to.type == NA_BROADCAST ) ||
	     ( ip6_socket == INVALID_SOCKET && NET_IS_IPv6( to.type ) ) ||
	     ( ip6_socket == INVALID_SOCKET && to.type == NA_MULTICAST6 ) )
	{
		return;
	}

	if ( to.type == NA_MULTICAST6 && ( net_enabled->integer & NET_DISABLEMCAST ) )
	{
		return;
	}

	memset( &addr, 0, sizeof( addr ) );
	NetadrToSockadr( &to, ( struct sockaddr * ) &addr );

	if ( usingSocks && addr.ss_family == AF_INET /*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( ip_socket, ( const char* )socksBuf, length + 10, 0, &socksRelayAddr, sizeof( socksRelayAddr ) );
	}
	else
	{
		if ( addr.ss_family == AF_INET )
		{
			ret = sendto( ip_socket, ( const char* )data, length, 0, ( struct sockaddr * ) &addr, sizeof( struct sockaddr_in ) );
		}
		else if ( addr.ss_family == AF_INET6 )
		{
			ret = sendto( ip6_socket, ( const char* )data, length, 0, ( struct sockaddr * ) &addr, sizeof( struct sockaddr_in6 ) );
		}
	}

	if ( ret == SOCKET_ERROR )
	{
		int err = socketError;

		// wouldblock is silent
		if ( err == EAGAIN )
		{
			return;
		}

		// some PPP links do not allow broadcasts and return an error
		if ( ( err == EADDRNOTAVAIL ) && ( ( to.type == NA_BROADCAST ) ) )
		{
			return;
		}

		if ( addr.ss_family == AF_INET )
		{
			Com_Printf( "Sys_SendPacket (ipv4): %s\n", NET_ErrorString() );
		}
		else if ( addr.ss_family == AF_INET6 )
		{
			Com_Printf( "Sys_SendPacket (ipv6): %s\n", NET_ErrorString() );
		}
		else
		{
			Com_Printf( "Sys_SendPacket (%i): %s\n", addr.ss_family , NET_ErrorString() );
		}
	}
}