Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Sep 9, 2010, 4:30:50 PM (14 years ago)
Author:
adrfried
Message:

IPv6 for Windows

I have not tested this, please test this and report issues to me.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • code/branches/ipv6/src/external/enet/win32.c

    r7328 r7390  
    5353}
    5454
     55static enet_uint16
     56enet_af (ENetAddressFamily family)
     57{
     58    if (family == ENET_IPV4)
     59        return AF_INET;
     60    if (family == ENET_IPV6)
     61        return AF_INET6;
     62    return 0;
     63}
     64
     65static socklen_t
     66enet_sa_size (ENetAddressFamily family)
     67{
     68    if (family == ENET_IPV4)
     69        return sizeof (SOCKADDR_IN);
     70    if (family == ENET_IPV6)
     71        return sizeof (SOCKADDR_IN6);
     72    return 0;
     73}
     74
     75static ENetAddressFamily
     76enet_address_set_address (ENetAddress * address, const SOCKADDR * sin)
     77{
     78    memset (address, 0, sizeof (ENetAddress));
     79    if (sin -> sa_family == AF_INET)
     80    {
     81        address -> host = enet_address_map4 ((((SOCKADDR_IN *) sin) -> sin_addr.s_addr));
     82        //address -> scopeID = 0;
     83        address -> port = ENET_NET_TO_HOST_16 (((SOCKADDR_IN *) sin) -> sin_port);
     84        return ENET_IPV4;
     85    }
     86    if (sin -> sa_family == AF_INET6)
     87    {
     88        address -> host = * (ENetHostAddress *) & ((SOCKADDR_IN6 *) sin) -> sin6_addr;
     89        address -> scopeID = ((SOCKADDR_IN6 *) sin) -> sin6_scope_id;
     90        address -> port = ENET_NET_TO_HOST_16 (((SOCKADDR_IN6 *) sin) -> sin6_port);
     91        return ENET_IPV6;
     92    }
     93    return ENET_NO_ADDRESS_FAMILY;
     94}
     95
     96static int
     97enet_address_set_sin (SOCKADDR * sin, const ENetAddress * address, ENetAddressFamily family)
     98{
     99    memset (sin, 0, enet_sa_size(family));
     100    if (family == ENET_IPV4 &&
     101      (enet_get_address_family (address) == ENET_IPV4 ||
     102      !memcmp (& address -> host, & ENET_HOST_ANY, sizeof(ENetHostAddress))))
     103    {
     104        ((SOCKADDR_IN *) sin) -> sin_family = AF_INET;
     105        ((SOCKADDR_IN *) sin) -> sin_addr = * (IN_ADDR *) & address -> host.addr[12];
     106        ((SOCKADDR_IN *) sin) -> sin_port = ENET_HOST_TO_NET_16 (address -> port);
     107        return 0;
     108    }
     109    else if (family == ENET_IPV6)
     110    {
     111        ((SOCKADDR_IN6 *) sin) -> sin6_family = AF_INET6;
     112        ((SOCKADDR_IN6 *) sin) -> sin6_addr = * (IN6_ADDR *) & address -> host;
     113        ((SOCKADDR_IN6 *) sin) -> sin6_scope_id = address -> scopeID;
     114        ((SOCKADDR_IN6 *) sin) -> sin6_port = ENET_HOST_TO_NET_16 (address -> port);
     115        return 0;
     116    }
     117    return -1;
     118}
     119
    55120int
    56121enet_address_set_host (ENetAddress * address, const char * name)
    57122{
    58     struct hostent * hostEntry;
    59 
    60     hostEntry = gethostbyname (name);
    61     if (hostEntry == NULL ||
    62         hostEntry -> h_addrtype != AF_INET)
    63     {
    64         unsigned long host = inet_addr (name);
    65         if (host == INADDR_NONE)
    66             return -1;
    67         address -> host = host;
    68         return 0;
    69     }
    70 
    71     address -> host = * (enet_uint32 *) hostEntry -> h_addr_list [0];
     123    enet_uint16 port = address -> port;
     124    ADDRINFO hints;
     125    ADDRINFO * result;
     126    ADDRINFO * res;
     127
     128    memset(& hints, 0, sizeof (hints));
     129    hints.ai_flags = AI_NUMERICSERV | AI_ADDRCONFIG;
     130    hints.ai_family = AF_UNSPEC;
     131
     132    if ( getaddrinfo(name, NULL, &hints, &result) )
     133        return -1;
     134
     135    for (res = result; res != NULL; res = res -> ai_next)
     136    {
     137        if ( enet_address_set_address(address, res -> ai_addr) != ENET_NO_ADDRESS_FAMILY )
     138            break;
     139    }
     140
     141    address -> port = port;
     142    freeaddrinfo(result);
     143    if (res == NULL) return -1;
     144
     145    return 0;
     146}
     147
     148static int
     149enet_address_get_host_x (const ENetAddress * address, char * name, size_t nameLength, int flags)
     150{
     151    SOCKADDR_STORAGE sin;
     152    enet_address_set_sin((SOCKADDR *) & sin, address, ENET_IPV6);
     153
     154    if ( getnameinfo((SOCKADDR *) & sin, enet_sa_size (ENET_IPV6), name, nameLength, NULL, 0, flags))
     155        return -1;
    72156
    73157    return 0;
     
    77161enet_address_get_host_ip (const ENetAddress * address, char * name, size_t nameLength)
    78162{
    79     char * addr = inet_ntoa (* (struct in_addr *) & address -> host);
    80     if (addr == NULL)
    81         return -1;
    82     strncpy (name, addr, nameLength);
    83     return 0;
     163    return enet_address_get_host_x(address, name, nameLength, NI_NUMERICHOST);
    84164}
    85165
     
    87167enet_address_get_host (const ENetAddress * address, char * name, size_t nameLength)
    88168{
    89     struct in_addr in;
    90     struct hostent * hostEntry;
    91    
    92     in.s_addr = address -> host;
    93    
    94     hostEntry = gethostbyaddr ((char *) & in, sizeof (struct in_addr), AF_INET);
    95     if (hostEntry == NULL)
    96       return enet_address_get_host_ip (address, name, nameLength);
    97 
    98     strncpy (name, hostEntry -> h_name, nameLength);
    99 
    100     return 0;
    101 }
    102 
    103 int
    104 enet_socket_bind (ENetSocket socket, const ENetAddress * address)
    105 {
    106     struct sockaddr_in sin;
    107 
    108     memset (& sin, 0, sizeof (struct sockaddr_in));
    109 
    110     sin.sin_family = AF_INET;
     169    return enet_address_get_host_x(address, name, nameLength, 0);
     170}
     171
     172int
     173enet_socket_bind (ENetSocket socket, const ENetAddress * address, ENetAddressFamily family)
     174{
     175    SOCKADDR_STORAGE sin;
    111176
    112177    if (address != NULL)
    113178    {
    114        sin.sin_port = ENET_HOST_TO_NET_16 (address -> port);
    115        sin.sin_addr.s_addr = address -> host;
     179        enet_address_set_sin((SOCKADDR *) & sin, address, family);
    116180    }
    117181    else
    118182    {
    119        sin.sin_port = 0;
    120        sin.sin_addr.s_addr = INADDR_ANY;
    121     }
    122 
    123     return bind (socket,
    124                  (struct sockaddr *) & sin,
    125                  sizeof (struct sockaddr_in)) == SOCKET_ERROR ? -1 : 0;
     183        ENetAddress address_ = { ENET_HOST_ANY, 0, 0 };
     184        enet_address_set_sin((SOCKADDR *) & sin, & address_, family);
     185    }
     186
     187    return bind (socket, (SOCKADDR *) & sin, enet_sa_size(family)) == SOCKET_ERROR ? -1 : 0;
    126188}
    127189
     
    133195
    134196ENetSocket
    135 enet_socket_create (ENetSocketType type)
     197enet_socket_create (ENetSocketType type, ENetAddressFamily family)
    136198{
    137199    return socket (PF_INET, type == ENET_SOCKET_TYPE_DATAGRAM ? SOCK_DGRAM : SOCK_STREAM, 0);
     
    174236
    175237int
    176 enet_socket_connect (ENetSocket socket, const ENetAddress * address)
    177 {
    178     struct sockaddr_in sin;
    179 
    180     memset (& sin, 0, sizeof (struct sockaddr_in));
    181 
    182     sin.sin_family = AF_INET;
    183     sin.sin_port = ENET_HOST_TO_NET_16 (address -> port);
    184     sin.sin_addr.s_addr = address -> host;
    185 
    186     return connect (socket, (struct sockaddr *) & sin, sizeof (struct sockaddr_in)) == SOCKET_ERROR ? -1 : 0;
     238enet_socket_connect (ENetSocket socket, const ENetAddress * address, ENetAddressFamily family)
     239{
     240    SOCKADDR_STORAGE sin;
     241    enet_address_set_sin((SOCKADDR *) & sin, address, family);
     242
     243    return connect (socket, (SOCKADDR *) & sin, enet_sa_size(family)) == SOCKET_ERROR ? -1 : 0;
    187244}
    188245
    189246ENetSocket
    190 enet_socket_accept (ENetSocket socket, ENetAddress * address)
     247enet_socket_accept (ENetSocket socket, ENetAddress * address, ENetAddressFamily family)
    191248{
    192249    SOCKET result;
    193     struct sockaddr_in sin;
    194     int sinLength = sizeof (struct sockaddr_in);
     250    SOCKADDR_STORAGE sin;
     251    int sinLength = enet_sa_size (family);
    195252
    196253    result = accept (socket,
    197                      address != NULL ? (struct sockaddr *) & sin : NULL,
     254                     address != NULL ? (SOCKADDR *) & sin : NULL,
    198255                     address != NULL ? & sinLength : NULL);
    199256
     
    203260    if (address != NULL)
    204261    {
    205         address -> host = (enet_uint32) sin.sin_addr.s_addr;
    206         address -> port = ENET_NET_TO_HOST_16 (sin.sin_port);
     262        enet_address_set_address(address, (SOCKADDR *) & sin);
    207263    }
    208264
     
    220276                  const ENetAddress * address,
    221277                  const ENetBuffer * buffers,
    222                   size_t bufferCount)
    223 {
    224     struct sockaddr_in sin;
     278                  size_t bufferCount,
     279                  ENetAddressFamily family)
     280{
     281    SOCKADDR_STORAGE sin;
    225282    DWORD sentLength;
    226283
    227284    if (address != NULL)
    228285    {
    229         memset (& sin, 0, sizeof (struct sockaddr_in));
    230 
    231         sin.sin_family = AF_INET;
    232         sin.sin_port = ENET_HOST_TO_NET_16 (address -> port);
    233         sin.sin_addr.s_addr = address -> host;
     286        enet_address_set_sin((SOCKADDR *) & sin, address, family);
    234287    }
    235288
     
    239292                   & sentLength,
    240293                   0,
    241                    address != NULL ? (struct sockaddr *) & sin : 0,
    242                    address != NULL ? sizeof (struct sockaddr_in) : 0,
     294                   address != NULL ? (SOCKADDR *) & sin : 0,
     295                   address != NULL ? enet_sa_size (family) : 0,
    243296                   NULL,
    244297                   NULL) == SOCKET_ERROR)
     
    257310                     ENetAddress * address,
    258311                     ENetBuffer * buffers,
    259                      size_t bufferCount)
    260 {
    261     INT sinLength = sizeof (struct sockaddr_in);
     312                     size_t bufferCount,
     313                     ENetAddressFamily family)
     314{
     315    INT sinLength = enet_sa_size (family);
    262316    DWORD flags = 0,
    263317          recvLength;
    264     struct sockaddr_in sin;
     318    SOCKADDR_STORAGE sin;
    265319
    266320    if (WSARecvFrom (socket,
     
    269323                     & recvLength,
    270324                     & flags,
    271                      address != NULL ? (struct sockaddr *) & sin : NULL,
     325                     address != NULL ? (SOCKADDR *) & sin : NULL,
    272326                     address != NULL ? & sinLength : NULL,
    273327                     NULL,
     
    289343    if (address != NULL)
    290344    {
    291         address -> host = (enet_uint32) sin.sin_addr.s_addr;
    292         address -> port = ENET_NET_TO_HOST_16 (sin.sin_port);
     345        enet_address_set_address(address, (SOCKADDR *) & sin);
    293346    }
    294347
     
    308361
    309362int
    310 enet_socket_wait (ENetSocket socket, enet_uint32 * condition, enet_uint32 timeout)
     363enet_socket_wait (ENetSocket socket4, ENetSocket socket6, enet_uint32 * condition, enet_uint32 timeout)
    311364{
    312365    fd_set readSet, writeSet;
    313366    struct timeval timeVal;
    314367    int selectCount;
    315    
     368
    316369    timeVal.tv_sec = timeout / 1000;
    317370    timeVal.tv_usec = (timeout % 1000) * 1000;
    318    
     371
    319372    FD_ZERO (& readSet);
    320373    FD_ZERO (& writeSet);
    321374
    322375    if (* condition & ENET_SOCKET_WAIT_SEND)
    323       FD_SET (socket, & writeSet);
     376    {
     377        if (socket4 != ENET_SOCKET_NULL)
     378            FD_SET (socket4, & writeSet);
     379        if (socket6 != ENET_SOCKET_NULL)
     380            FD_SET (socket6, & writeSet);
     381    }
    324382
    325383    if (* condition & ENET_SOCKET_WAIT_RECEIVE)
    326       FD_SET (socket, & readSet);
    327 
    328     selectCount = select (socket + 1, & readSet, & writeSet, NULL, & timeVal);
     384    {
     385        if (socket4 != ENET_SOCKET_NULL)
     386            FD_SET (socket4, & readSet);
     387        if (socket6 != ENET_SOCKET_NULL)
     388            FD_SET (socket6, & readSet);
     389    }
     390
     391    ENetSocket maxSocket = 0;
     392    if (socket4 != ENET_SOCKET_NULL)
     393        maxSocket = socket4;
     394    if (socket6 != ENET_SOCKET_NULL && socket6 > maxSocket)
     395        maxSocket = socket6;
     396
     397    selectCount = select (maxSocket + 1, & readSet, & writeSet, NULL, & timeVal);
    329398
    330399    if (selectCount < 0)
     
    336405      return 0;
    337406
    338     if (FD_ISSET (socket, & writeSet))
    339       * condition |= ENET_SOCKET_WAIT_SEND;
    340    
    341     if (FD_ISSET (socket, & readSet))
    342       * condition |= ENET_SOCKET_WAIT_RECEIVE;
    343 
    344     return 0;
    345 }
     407    if ( (socket4 != ENET_SOCKET_NULL && FD_ISSET (socket4, & writeSet)) ||
     408        (socket6 != ENET_SOCKET_NULL && FD_ISSET (socket6, & writeSet)) )
     409        * condition |= ENET_SOCKET_WAIT_SEND;
     410
     411    if ( (socket4 != ENET_SOCKET_NULL && FD_ISSET (socket4, & readSet)) ||
     412        (socket6 != ENET_SOCKET_NULL && FD_ISSET (socket6, & readSet)) )
     413        * condition |= ENET_SOCKET_WAIT_RECEIVE;
     414
     415    return 0;
     416}
    346417
    347418#endif
Note: See TracChangeset for help on using the changeset viewer.