Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/ipv6/src/external/enet/patches/patch @ 7377

Last change on this file since 7377 was 7377, checked in by adrfried, 15 years ago

using two separate sockets for ipv4 and ipv6

File size: 26.8 KB
  • host.c

    diff --git a/host.c b/host.c
    index 8bb2433..85dfa3c 100644
    a b enet_host_create (const ENetAddress * address, size_t peerCount, size_t channelL 
    4848    }
    4949    memset (host -> peers, 0, peerCount * sizeof (ENetPeer));
    5050
    51     host -> socket = enet_socket_create (ENET_SOCKET_TYPE_DATAGRAM);
    52     if (host -> socket == ENET_SOCKET_NULL || (address != NULL && enet_socket_bind (host -> socket, address) < 0))
     51
     52    // FIXME: check address for ANY_ADRESS if not only bind to specific protocol
     53    // FIXME: allow to fail one of the two protocols
     54    /* IPv4 */
     55    host -> socket4 = enet_socket_create (ENET_SOCKET_TYPE_DATAGRAM, ENET_IPV4);
     56    if (host -> socket4 == ENET_SOCKET_NULL || (address != NULL && enet_socket_bind (host -> socket4, address, ENET_IPV4) < 0))
    5357    {
    54        if (host -> socket != ENET_SOCKET_NULL)
    55          enet_socket_destroy (host -> socket);
     58       if (host -> socket4 != ENET_SOCKET_NULL)
     59         enet_socket_destroy (host -> socket4);
    5660
    5761       enet_free (host -> peers);
    5862       enet_free (host);
    enet_host_create (const ENetAddress * address, size_t peerCount, size_t channelL 
    6064       return NULL;
    6165    }
    6266
    63     enet_socket_set_option (host -> socket, ENET_SOCKOPT_NONBLOCK, 1);
    64     enet_socket_set_option (host -> socket, ENET_SOCKOPT_BROADCAST, 1);
    65     enet_socket_set_option (host -> socket, ENET_SOCKOPT_RCVBUF, ENET_HOST_RECEIVE_BUFFER_SIZE);
    66     enet_socket_set_option (host -> socket, ENET_SOCKOPT_SNDBUF, ENET_HOST_SEND_BUFFER_SIZE);
     67    enet_socket_set_option (host -> socket4, ENET_SOCKOPT_NONBLOCK, 1);
     68    enet_socket_set_option (host -> socket4, ENET_SOCKOPT_BROADCAST, 1);
     69    enet_socket_set_option (host -> socket4, ENET_SOCKOPT_RCVBUF, ENET_HOST_RECEIVE_BUFFER_SIZE);
     70    enet_socket_set_option (host -> socket4, ENET_SOCKOPT_SNDBUF, ENET_HOST_SEND_BUFFER_SIZE);
     71
     72    /* IPv6 */
     73    host -> socket6 = enet_socket_create (ENET_SOCKET_TYPE_DATAGRAM, ENET_IPV6);
     74    if (host -> socket6 == ENET_SOCKET_NULL || (address != NULL && enet_socket_bind (host -> socket6, address, ENET_IPV6) < 0))
     75    {
     76       if (host -> socket6 != ENET_SOCKET_NULL)
     77       {
     78           enet_socket_destroy (host -> socket4);
     79           enet_socket_destroy (host -> socket6);
     80       }
     81
     82       enet_free (host -> peers);
     83       enet_free (host);
     84
     85       return NULL;
     86    }
     87
     88    enet_socket_set_option (host -> socket6, ENET_SOCKOPT_NONBLOCK, 1);
     89    enet_socket_set_option (host -> socket6, ENET_SOCKOPT_BROADCAST, 1);
     90    enet_socket_set_option (host -> socket6, ENET_SOCKOPT_RCVBUF, ENET_HOST_RECEIVE_BUFFER_SIZE);
     91    enet_socket_set_option (host -> socket6, ENET_SOCKOPT_SNDBUF, ENET_HOST_SEND_BUFFER_SIZE);
     92
    6793
    6894    if (address != NULL)
    6995      host -> address = * address;
    enet_host_destroy (ENetHost * host) 
    133159{
    134160    ENetPeer * currentPeer;
    135161
    136     enet_socket_destroy (host -> socket);
     162    enet_socket_destroy (host -> socket4);
     163    enet_socket_destroy (host -> socket6);
    137164
    138165    for (currentPeer = host -> peers;
    139166         currentPeer < & host -> peers [host -> peerCount];
  • include/enet/enet.h

    diff --git a/include/enet/enet.h b/include/enet/enet.h
    index 2f656d6..39cf93e 100644
    a b typedef enum _ENetSocketOption 
    5353   ENET_SOCKOPT_REUSEADDR = 5
    5454} ENetSocketOption;
    5555
    56 enum
     56typedef struct _ENetHostAddress
    5757{
    58    ENET_HOST_ANY       = 0,            /**< specifies the default server host */
    59    ENET_HOST_BROADCAST = 0xFFFFFFFF,   /**< specifies a subnet-wide broadcast */
     58   enet_uint8 addr[16];
     59} ENetHostAddress;
    6060
    61    ENET_PORT_ANY       = 0             /**< specifies that a port should be automatically chosen */
    62 };
     61extern const ENetHostAddress ENET_HOST_ANY;          /**< specifies the default server host */
     62extern const ENetHostAddress ENET_IPV4MAPPED_PREFIX; /**< specifies the IPv4-mapped IPv6 prefix */
     63extern const ENetHostAddress ENET_HOST_BROADCAST;    /**< specifies a IPv4 subnet-wide broadcast */
     64#define ENET_IPV4MAPPED_PREFIX_LEN 12                /**< specifies the length of the IPv4-mapped IPv6 prefix */
     65#define ENET_PORT_ANY 0                              /**< specifies that a port should be automatically chosen */
    6366
    6467/**
    6568 * Portable internet address structure.
    enum 
    7376 */
    7477typedef struct _ENetAddress
    7578{
    76    enet_uint32 host;
     79   ENetHostAddress host;
     80   enet_uint32 scopeID; //FIXME: this is of different size on Windows
    7781   enet_uint16 port;
    7882} ENetAddress;
    7983
    8084/**
     85 * The address family type.
     86 */
     87typedef enum _ENetAddressFamily
     88{
     89    ENET_NO_ADDRESS_FAMILY = 0,
     90    ENET_IPV4 = 1,
     91    ENET_IPV6 = 2
     92} ENetAddressFamily;
     93
     94/**
    8195 * Packet flag bit constants.
    8296 *
    8397 * The host must be specified in network byte-order, and the port must be in
    typedef enet_uint32 (ENET_CALLBACK * ENetChecksumCallback) (const ENetBuffer * b 
    321335  */
    322336typedef struct _ENetHost
    323337{
    324    ENetSocket           socket;
     338   ENetSocket           socket4;
     339   ENetSocket           socket6;
    325340   ENetAddress          address;                     /**< Internet address of the host */
    326341   enet_uint32          incomingBandwidth;           /**< downstream bandwidth of the host */
    327342   enet_uint32          outgoingBandwidth;           /**< upstream bandwidth of the host */
    ENET_API void enet_time_set (enet_uint32); 
    441456/** @defgroup socket ENet socket functions
    442457    @{
    443458*/
    444 ENET_API ENetSocket enet_socket_create (ENetSocketType);
    445 ENET_API int        enet_socket_bind (ENetSocket, const ENetAddress *);
     459ENET_API ENetSocket enet_socket_create (ENetSocketType, ENetAddressFamily);
     460ENET_API int        enet_socket_bind (ENetSocket, const ENetAddress *, ENetAddressFamily);
    446461ENET_API int        enet_socket_listen (ENetSocket, int);
    447 ENET_API ENetSocket enet_socket_accept (ENetSocket, ENetAddress *);
    448 ENET_API int        enet_socket_connect (ENetSocket, const ENetAddress *);
    449 ENET_API int        enet_socket_send (ENetSocket, const ENetAddress *, const ENetBuffer *, size_t);
    450 ENET_API int        enet_socket_receive (ENetSocket, ENetAddress *, ENetBuffer *, size_t);
    451 ENET_API int        enet_socket_wait (ENetSocket, enet_uint32 *, enet_uint32);
     462ENET_API ENetSocket enet_socket_accept (ENetSocket, ENetAddress *, ENetAddressFamily);
     463ENET_API int        enet_socket_connect (ENetSocket, const ENetAddress *, ENetAddressFamily);
     464ENET_API int        enet_socket_send (ENetSocket, const ENetAddress *, const ENetBuffer *, size_t, ENetAddressFamily);
     465ENET_API int        enet_socket_receive (ENetSocket, ENetAddress *, ENetBuffer *, size_t, ENetAddressFamily);
     466ENET_API int        enet_socket_wait (ENetSocket, ENetSocket, enet_uint32 *, enet_uint32);
    452467ENET_API int        enet_socket_set_option (ENetSocket, ENetSocketOption, int);
    453468ENET_API void       enet_socket_destroy (ENetSocket);
    454469ENET_API int        enet_socketset_select (ENetSocket, ENetSocketSet *, ENetSocketSet *, enet_uint32);
    ENET_API int enet_address_get_host_ip (const ENetAddress * address, char * hostN 
    488503*/
    489504ENET_API int enet_address_get_host (const ENetAddress * address, char * hostName, size_t nameLength);
    490505
     506/** Maps an IPv4 Address to an IPv6 address.
     507    @param address IPv4 address in network byte order
     508    @returns the IPv4-mapped IPv6 address in network byte order
     509*/
     510ENET_API ENetHostAddress enet_address_map4 (enet_uint32 address);
     511
     512/** Returns the Address family of an (IPv4-mapped) IPv6 address.
     513    @param address IPv6 address
     514    @returns address family
     515*/
     516ENET_API ENetAddressFamily enet_get_address_family (const ENetAddress * address);
     517
    491518/** @} */
    492519
    493520ENET_API ENetPacket * enet_packet_create (const void *, size_t, enet_uint32);
  • protocol.c

    diff --git a/protocol.c b/protocol.c
    index 8e26dfb..37f6387 100644
    a b  
    99#include "enet/time.h"
    1010#include "enet/enet.h"
    1111
     12const ENetHostAddress ENET_HOST_ANY = { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } };
     13const ENetHostAddress ENET_IPV4MAPPED_PREFIX = { { 0,0,0,0,0,0,0,0,0,0, 0xff, 0xff, 0,0,0,0 } };
     14const ENetHostAddress ENET_HOST_BROADCAST = { { 0,0,0,0,0,0,0,0,0,0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } };
     15
    1216static size_t commandSizes [ENET_PROTOCOL_COMMAND_COUNT] =
    1317{
    1418    0,
    static size_t commandSizes [ENET_PROTOCOL_COMMAND_COUNT] = 
    2529    sizeof (ENetProtocolThrottleConfigure),
    2630};
    2731
     32ENetHostAddress
     33enet_address_map4 (enet_uint32 address)
     34{
     35    ENetHostAddress addr = ENET_IPV4MAPPED_PREFIX;
     36    ((enet_uint32 *)addr.addr)[3] = address;
     37    return addr;
     38}
     39
     40ENetAddressFamily
     41enet_get_address_family (const ENetAddress * address)
     42{
     43    if (!memcmp(& address->host, & ENET_IPV4MAPPED_PREFIX, ENET_IPV4MAPPED_PREFIX_LEN))
     44        return ENET_IPV4;
     45    return ENET_IPV6;
     46}
     47
    2848size_t
    2949enet_protocol_command_size (enet_uint8 commandNumber)
    3050{
    enet_protocol_handle_connect (ENetHost * host, ENetProtocolHeader * header, ENet 
    262282         ++ currentPeer)
    263283    {
    264284        if (currentPeer -> state != ENET_PEER_STATE_DISCONNECTED &&
    265             currentPeer -> address.host == host -> receivedAddress.host &&
    266285            currentPeer -> address.port == host -> receivedAddress.port &&
    267             currentPeer -> connectID == command -> connect.connectID)
     286            currentPeer -> connectID == command -> connect.connectID &&
     287            !memcmp(& currentPeer -> address.host, & host -> receivedAddress.host, sizeof (ENetHostAddress)))
    268288          return NULL;
    269289    }
    270290
    enet_protocol_handle_incoming_commands (ENetHost * host, ENetEvent * event) 
    848868
    849869       if (peer -> state == ENET_PEER_STATE_DISCONNECTED ||
    850870           peer -> state == ENET_PEER_STATE_ZOMBIE ||
    851            (host -> receivedAddress.host != peer -> address.host &&
    852              peer -> address.host != ENET_HOST_BROADCAST) ||
    853871           (peer -> outgoingPeerID < ENET_PROTOCOL_MAXIMUM_PEER_ID &&
    854             sessionID != peer -> incomingSessionID))
     872            sessionID != peer -> incomingSessionID) ||
     873           ( memcmp(& peer -> address.host, & host -> receivedAddress.host, sizeof (ENetHostAddress)) &&
     874             memcmp(& peer -> address.host, & ENET_HOST_BROADCAST, sizeof (ENetHostAddress)) &&
     875             peer -> address.host.addr[0] != 0xff ) )
    855876         return 0;
    856877    }
    857878 
    enet_protocol_handle_incoming_commands (ENetHost * host, ENetEvent * event) 
    891912       
    892913    if (peer != NULL)
    893914    {
    894        peer -> address.host = host -> receivedAddress.host;
    895        peer -> address.port = host -> receivedAddress.port;
     915       peer -> address = host -> receivedAddress;
    896916       peer -> incomingDataTotal += host -> receivedDataLength;
    897917    }
    898918   
    commandError: 
    10211041}
    10221042 
    10231043static int
    1024 enet_protocol_receive_incoming_commands (ENetHost * host, ENetEvent * event)
     1044enet_protocol_receive_incoming_commands (ENetHost * host, ENetEvent * event, ENetAddressFamily family)
    10251045{
    10261046    for (;;)
    10271047    {
    enet_protocol_receive_incoming_commands (ENetHost * host, ENetEvent * event) 
    10311051       buffer.data = host -> packetData [0];
    10321052       buffer.dataLength = sizeof (host -> packetData [0]);
    10331053
    1034        receivedLength = enet_socket_receive (host -> socket,
     1054       receivedLength = enet_socket_receive (family == ENET_IPV4 ? host -> socket4 : host -> socket6,
    10351055                                             & host -> receivedAddress,
    10361056                                             & buffer,
    1037                                              1);
     1057                                             1,
     1058                                             family);
    10381059
    10391060       if (receivedLength < 0)
    10401061         return -1;
    enet_protocol_receive_incoming_commands (ENetHost * host, ENetEvent * event) 
    10421063       if (receivedLength == 0)
    10431064         return 0;
    10441065
     1066       if (enet_get_address_family (& host -> receivedAddress) != family)
     1067         return -1;
     1068
    10451069       host -> receivedData = host -> packetData [0];
    10461070       host -> receivedDataLength = receivedLength;
    10471071     
    enet_protocol_send_outgoing_commands (ENetHost * host, ENetEvent * event, int ch 
    14971521
    14981522        currentPeer -> lastSendTime = host -> serviceTime;
    14991523
    1500         sentLength = enet_socket_send (host -> socket, & currentPeer -> address, host -> buffers, host -> bufferCount);
     1524        ENetAddressFamily family = enet_get_address_family (& currentPeer -> address);
     1525        sentLength = enet_socket_send (family == ENET_IPV4 ? host -> socket4 : host -> socket6,
     1526                                           & currentPeer -> address,
     1527                                           host -> buffers,
     1528                                           host -> bufferCount,
     1529                                           family);
    15011530
    15021531        enet_protocol_remove_sent_unreliable_commands (currentPeer);
    15031532
    enet_host_service (ENetHost * host, ENetEvent * event, enet_uint32 timeout) 
    16081637          break;
    16091638       }
    16101639
    1611        switch (enet_protocol_receive_incoming_commands (host, event))
     1640       switch (enet_protocol_receive_incoming_commands (host, event, ENET_IPV4))
     1641       {
     1642       case 1:
     1643          return 1;
     1644
     1645       case -1:
     1646          perror ("Error receiving incoming packets");
     1647
     1648          return -1;
     1649
     1650       default:
     1651          break;
     1652       }
     1653
     1654       switch (enet_protocol_receive_incoming_commands (host, event, ENET_IPV6))
    16121655       {
    16131656       case 1:
    16141657          return 1;
    enet_host_service (ENetHost * host, ENetEvent * event, enet_uint32 timeout) 
    16601703
    16611704       waitCondition = ENET_SOCKET_WAIT_RECEIVE;
    16621705
    1663        if (enet_socket_wait (host -> socket, & waitCondition, ENET_TIME_DIFFERENCE (timeout, host -> serviceTime)) != 0)
     1706       if (enet_socket_wait (host -> socket4, host -> socket6, & waitCondition, ENET_TIME_DIFFERENCE (timeout, host -> serviceTime)) != 0)
    16641707         return -1;
    16651708       
    16661709       host -> serviceTime = enet_time_get ();
  • unix.c

    diff --git a/unix.c b/unix.c
    index 6971541..96d17f8 100644
    a b enet_time_set (enet_uint32 newTimeBase) 
    7171    timeBase = timeVal.tv_sec * 1000 + timeVal.tv_usec / 1000 - newTimeBase;
    7272}
    7373
    74 int
    75 enet_address_set_host (ENetAddress * address, const char * name)
     74static enet_uint16
     75enet_af (ENetAddressFamily family)
    7676{
    77     struct hostent * hostEntry = NULL;
    78 #ifdef HAS_GETHOSTBYNAME_R
    79     struct hostent hostData;
    80     char buffer [2048];
    81     int errnum;
    82 
    83 #if defined(linux) || defined(__linux) || defined(__linux__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
    84     gethostbyname_r (name, & hostData, buffer, sizeof (buffer), & hostEntry, & errnum);
    85 #else
    86     hostEntry = gethostbyname_r (name, & hostData, buffer, sizeof (buffer), & errnum);
    87 #endif
    88 #else
    89     hostEntry = gethostbyname (name);
    90 #endif
     77    if (family == ENET_IPV4)
     78        return AF_INET;
     79    if (family == ENET_IPV6)
     80        return AF_INET6;
     81    return 0;
     82}
    9183
    92     if (hostEntry == NULL ||
    93         hostEntry -> h_addrtype != AF_INET)
    94     {
    95 #ifdef HAS_INET_PTON
    96         if (! inet_pton (AF_INET, name, & address -> host))
    97 #else
    98         if (! inet_aton (name, (struct in_addr *) & address -> host))
    99 #endif
    100             return -1;
    101         return 0;
    102     }
     84static socklen_t
     85enet_sa_size (ENetAddressFamily family)
     86{
     87    if (family == ENET_IPV4)
     88        return sizeof (struct sockaddr_in);
     89    if (family == ENET_IPV6)
     90        return sizeof (struct sockaddr_in6);
     91    return 0;
     92}
    10393
    104     address -> host = * (enet_uint32 *) hostEntry -> h_addr_list [0];
    10594
    106     return 0;
     95static ENetAddressFamily
     96enet_address_set_address (ENetAddress * address, const struct sockaddr * sin)
     97{
     98    memset (address, 0, sizeof (ENetAddress));
     99    if (sin -> sa_family == AF_INET)
     100    {
     101        address -> host = enet_address_map4 ((((struct sockaddr_in *) sin) -> sin_addr.s_addr));
     102        //address -> scopeID = 0;
     103        address -> port = ENET_NET_TO_HOST_16 (((struct sockaddr_in *) sin) -> sin_port);
     104        return ENET_IPV4;
     105    }
     106    if (sin -> sa_family == AF_INET6)
     107    {
     108        address -> host = * (ENetHostAddress *) & ((struct sockaddr_in6 *) sin) -> sin6_addr;
     109        address -> scopeID = ((struct sockaddr_in6 *) sin) -> sin6_scope_id;
     110        address -> port = ENET_NET_TO_HOST_16 (((struct sockaddr_in6 *) sin) -> sin6_port);
     111        return ENET_IPV6;
     112    }
     113    return ENET_NO_ADDRESS_FAMILY;
    107114}
    108115
    109 int
    110 enet_address_get_host_ip (const ENetAddress * address, char * name, size_t nameLength)
     116static int
     117enet_address_set_sin (struct sockaddr * sin, const ENetAddress * address, ENetAddressFamily family)
    111118{
    112 #ifdef HAS_INET_NTOP
    113     if (inet_ntop (AF_INET, & address -> host, name, nameLength) == NULL)
    114 #else
    115     char * addr = inet_ntoa (* (struct in_addr *) & address -> host);
    116     if (addr != NULL)
    117         strncpy (name, addr, nameLength);
    118     else
    119 #endif
    120         return -1;
    121     return 0;
     119    memset (sin, 0, enet_sa_size(family));
     120    if (family == ENET_IPV4 &&
     121      (enet_get_address_family (address) == ENET_IPV4 ||
     122      !memcmp (address, & ENET_HOST_ANY, sizeof(ENetHostAddress))))
     123    {
     124        ((struct sockaddr_in *) sin) -> sin_family = AF_INET;
     125        ((struct sockaddr_in *) sin) -> sin_addr = * (struct in_addr *) & address -> host.addr[12];
     126        ((struct sockaddr_in *) sin) -> sin_port = ENET_HOST_TO_NET_16 (address -> port);
     127        return 0;
     128    }
     129    else if (family == ENET_IPV6)
     130    {
     131        ((struct sockaddr_in6 *) sin) -> sin6_family = AF_INET6;
     132        ((struct sockaddr_in6 *) sin) -> sin6_addr = * (struct in6_addr *) & address -> host;
     133        ((struct sockaddr_in6 *) sin) -> sin6_scope_id = address -> scopeID;
     134        ((struct sockaddr_in6 *) sin) -> sin6_port = ENET_HOST_TO_NET_16 (address -> port);
     135        return 0;
     136    }
     137    return -1;
    122138}
    123139
    124140int
    125 enet_address_get_host (const ENetAddress * address, char * name, size_t nameLength)
     141enet_address_set_host (ENetAddress * address, const char * name)
    126142{
    127     struct in_addr in;
    128     struct hostent * hostEntry = NULL;
    129 #ifdef HAS_GETHOSTBYADDR_R
    130     struct hostent hostData;
    131     char buffer [2048];
    132     int errnum;
     143    enet_uint16 port = address -> port;
     144    struct addrinfo hints;
     145    struct addrinfo * result;
     146    struct addrinfo * res;
    133147
    134     in.s_addr = address -> host;
     148    memset(& hints, 0, sizeof (hints));
     149    hints.ai_flags = AI_NUMERICSERV | AI_ADDRCONFIG;
     150    hints.ai_family = AF_UNSPEC;
    135151
    136 #if defined(linux) || defined(__linux) || defined(__linux__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
    137     gethostbyaddr_r ((char *) & in, sizeof (struct in_addr), AF_INET, & hostData, buffer, sizeof (buffer), & hostEntry, & errnum);
    138 #else
    139     hostEntry = gethostbyaddr_r ((char *) & in, sizeof (struct in_addr), AF_INET, & hostData, buffer, sizeof (buffer), & errnum);
    140 #endif
    141 #else
    142     in.s_addr = address -> host;
     152    if ( getaddrinfo(name, NULL, &hints, &result) )
     153        return -1;
    143154
    144     hostEntry = gethostbyaddr ((char *) & in, sizeof (struct in_addr), AF_INET);
    145 #endif
     155    for (res = result; res != NULL; res = res -> ai_next)
     156    {
     157        if ( enet_address_set_address(address, res -> ai_addr) != ENET_NO_ADDRESS_FAMILY )
     158            break;
     159    }
    146160
    147     if (hostEntry == NULL)
    148       return enet_address_get_host_ip (address, name, nameLength);
     161    address -> port = port;
     162    freeaddrinfo(result);
     163    if (res == NULL) return -1;
    149164
    150     strncpy (name, hostEntry -> h_name, nameLength);
     165    return 0;
     166}
     167
     168static int
     169enet_address_get_host_x (const ENetAddress * address, char * name, size_t nameLength, int flags)
     170{
     171    struct sockaddr_storage sin;
     172    enet_address_set_sin((struct sockaddr *) & sin, address, ENET_IPV6);
     173
     174    if ( getnameinfo((struct sockaddr *) & sin, enet_sa_size (ENET_IPV6), name, nameLength, NULL, 0, flags))
     175        return -1;
    151176
    152177    return 0;
    153178}
    154179
    155180int
    156 enet_socket_bind (ENetSocket socket, const ENetAddress * address)
     181enet_address_get_host_ip (const ENetAddress * address, char * name, size_t nameLength)
    157182{
    158     struct sockaddr_in sin;
     183    return enet_address_get_host_x(address, name, nameLength, NI_NUMERICHOST);
     184}
    159185
    160     memset (& sin, 0, sizeof (struct sockaddr_in));
     186int
     187enet_address_get_host (const ENetAddress * address, char * name, size_t nameLength)
     188{
     189    return enet_address_get_host_x(address, name, nameLength, 0);
     190}
    161191
    162     sin.sin_family = AF_INET;
     192int
     193enet_socket_bind (ENetSocket socket, const ENetAddress * address, ENetAddressFamily family)
     194{
     195    struct sockaddr_storage sin;
    163196
    164197    if (address != NULL)
    165198    {
    166        sin.sin_port = ENET_HOST_TO_NET_16 (address -> port);
    167        sin.sin_addr.s_addr = address -> host;
     199        enet_address_set_sin((struct sockaddr *) & sin, address, family);
    168200    }
    169201    else
    170202    {
    171        sin.sin_port = 0;
    172        sin.sin_addr.s_addr = INADDR_ANY;
     203        ENetAddress address_ = { ENET_HOST_ANY, 0, 0 };
     204        enet_address_set_sin((struct sockaddr *) & sin, & address_, family);
    173205    }
    174206
    175     return bind (socket,
    176                  (struct sockaddr *) & sin,
    177                  sizeof (struct sockaddr_in));
     207    return bind (socket, (struct sockaddr *) & sin, enet_sa_size(family));
    178208}
    179209
    180 int 
     210int
    181211enet_socket_listen (ENetSocket socket, int backlog)
    182212{
    183213    return listen (socket, backlog < 0 ? SOMAXCONN : backlog);
    184214}
    185215
    186216ENetSocket
    187 enet_socket_create (ENetSocketType type)
     217enet_socket_create (ENetSocketType type, ENetAddressFamily family)
    188218{
    189     return socket (PF_INET, type == ENET_SOCKET_TYPE_DATAGRAM ? SOCK_DGRAM : SOCK_STREAM, 0);
     219    ENetSocket sock = socket (enet_af (family), type == ENET_SOCKET_TYPE_DATAGRAM ? SOCK_DGRAM : SOCK_STREAM, 0);
     220
     221#ifdef IPV6_V6ONLY
     222    if (family == ENET_IPV6)
     223    {
     224        int value = 1;
     225        setsockopt (sock, IPPROTO_IPV6, IPV6_V6ONLY, & value, sizeof (int));
     226    }
     227#endif // IPV6_V6ONLY
     228
     229    return sock;
    190230}
    191231
    192232int
    enet_socket_set_option (ENetSocket socket, ENetSocketOption option, int value) 
    226266}
    227267
    228268int
    229 enet_socket_connect (ENetSocket socket, const ENetAddress * address)
     269enet_socket_connect (ENetSocket socket, const ENetAddress * address, ENetAddressFamily family)
    230270{
    231     struct sockaddr_in sin;
    232 
    233     memset (& sin, 0, sizeof (struct sockaddr_in));
     271    struct sockaddr_storage sin;
     272    enet_address_set_sin((struct sockaddr *) & sin, address, family);
    234273
    235     sin.sin_family = AF_INET;
    236     sin.sin_port = ENET_HOST_TO_NET_16 (address -> port);
    237     sin.sin_addr.s_addr = address -> host;
    238 
    239     return connect (socket, (struct sockaddr *) & sin, sizeof (struct sockaddr_in));
     274    return connect (socket, (struct sockaddr *) & sin, enet_sa_size (family));
    240275}
    241276
    242277ENetSocket
    243 enet_socket_accept (ENetSocket socket, ENetAddress * address)
     278enet_socket_accept (ENetSocket socket, ENetAddress * address, ENetAddressFamily family)
    244279{
    245280    int result;
    246     struct sockaddr_in sin;
    247     socklen_t sinLength = sizeof (struct sockaddr_in);
     281    struct sockaddr_storage sin;
     282    socklen_t sinLength = enet_sa_size (family);
    248283
    249284    result = accept (socket,
    250285                     address != NULL ? (struct sockaddr *) & sin : NULL,
    251286                     address != NULL ? & sinLength : NULL);
    252    
     287
    253288    if (result == -1)
    254289      return ENET_SOCKET_NULL;
    255290
    256291    if (address != NULL)
    257292    {
    258         address -> host = (enet_uint32) sin.sin_addr.s_addr;
    259         address -> port = ENET_NET_TO_HOST_16 (sin.sin_port);
     293        enet_address_set_address(address, (struct sockaddr *) & sin);
    260294    }
    261295
    262296    return result;
    int 
    272306enet_socket_send (ENetSocket socket,
    273307                  const ENetAddress * address,
    274308                  const ENetBuffer * buffers,
    275                   size_t bufferCount)
     309                  size_t bufferCount,
     310                  ENetAddressFamily family)
    276311{
    277312    struct msghdr msgHdr;
    278     struct sockaddr_in sin;
     313    struct sockaddr_storage sin;
    279314    int sentLength;
    280315
    281316    memset (& msgHdr, 0, sizeof (struct msghdr));
    282317
    283318    if (address != NULL)
    284319    {
    285         memset (& sin, 0, sizeof (struct sockaddr_in));
    286 
    287         sin.sin_family = AF_INET;
    288         sin.sin_port = ENET_HOST_TO_NET_16 (address -> port);
    289         sin.sin_addr.s_addr = address -> host;
    290 
     320        enet_address_set_sin((struct sockaddr *) & sin, address, family);
    291321        msgHdr.msg_name = & sin;
    292         msgHdr.msg_namelen = sizeof (struct sockaddr_in);
     322        msgHdr.msg_namelen = enet_sa_size (family);
    293323    }
    294324
    295325    msgHdr.msg_iov = (struct iovec *) buffers;
    int 
    312342enet_socket_receive (ENetSocket socket,
    313343                     ENetAddress * address,
    314344                     ENetBuffer * buffers,
    315                      size_t bufferCount)
     345                     size_t bufferCount,
     346                     ENetAddressFamily family)
    316347{
    317348    struct msghdr msgHdr;
    318     struct sockaddr_in sin;
     349    struct sockaddr_storage sin;
    319350    int recvLength;
    320351
    321352    memset (& msgHdr, 0, sizeof (struct msghdr));
    enet_socket_receive (ENetSocket socket, 
    323354    if (address != NULL)
    324355    {
    325356        msgHdr.msg_name = & sin;
    326         msgHdr.msg_namelen = sizeof (struct sockaddr_in);
     357        msgHdr.msg_namelen = enet_sa_size (family);
    327358    }
    328359
    329360    msgHdr.msg_iov = (struct iovec *) buffers;
    enet_socket_receive (ENetSocket socket, 
    346377
    347378    if (address != NULL)
    348379    {
    349         address -> host = (enet_uint32) sin.sin_addr.s_addr;
    350         address -> port = ENET_NET_TO_HOST_16 (sin.sin_port);
     380        enet_address_set_address(address, (struct sockaddr *) & sin);
    351381    }
    352382
    353383    return recvLength;
    enet_socketset_select (ENetSocket maxSocket, ENetSocketSet * readSet, ENetSocket 
    365395}
    366396
    367397int
    368 enet_socket_wait (ENetSocket socket, enet_uint32 * condition, enet_uint32 timeout)
     398enet_socket_wait (ENetSocket socket4, ENetSocket socket6, enet_uint32 * condition, enet_uint32 timeout)
    369399{
    370 #ifdef HAS_POLL
    371     struct pollfd pollSocket;
     400    //FIXME allow only one of the sockets being available
     401//#ifdef HAS_POLL
     402    struct pollfd pollSocket[2];
    372403    int pollCount;
    373404   
    374     pollSocket.fd = socket;
    375     pollSocket.events = 0;
     405    pollSocket[0].fd = socket4;
     406    pollSocket[1].fd = socket6;
     407    pollSocket[0].events = 0;
     408    pollSocket[1].events = 0;
    376409
    377410    if (* condition & ENET_SOCKET_WAIT_SEND)
    378       pollSocket.events |= POLLOUT;
     411    {
     412        pollSocket[0].events |= POLLOUT;
     413        pollSocket[1].events |= POLLOUT;
     414    }
    379415
    380416    if (* condition & ENET_SOCKET_WAIT_RECEIVE)
    381       pollSocket.events |= POLLIN;
     417    {
     418        pollSocket[0].events |= POLLIN;
     419        pollSocket[1].events |= POLLIN;
     420    }
    382421
    383     pollCount = poll (& pollSocket, 1, timeout);
     422    pollCount = poll (pollSocket, 2, timeout);
    384423
    385424    if (pollCount < 0)
    386425      return -1;
    enet_socket_wait (ENetSocket socket, enet_uint32 * condition, enet_uint32 timeou 
    390429    if (pollCount == 0)
    391430      return 0;
    392431
    393     if (pollSocket.revents & POLLOUT)
     432    if ((pollSocket[0].revents | pollSocket[1].revents) & POLLOUT)
    394433      * condition |= ENET_SOCKET_WAIT_SEND;
    395434   
    396     if (pollSocket.revents & POLLIN)
     435    if ((pollSocket[0].revents | pollSocket[1].revents) & POLLIN)
    397436      * condition |= ENET_SOCKET_WAIT_RECEIVE;
    398437
    399438    return 0;
     439/*
     440FIXME: implement this
    400441#else
    401442    fd_set readSet, writeSet;
    402443    struct timeval timeVal;
    enet_socket_wait (ENetSocket socket, enet_uint32 * condition, enet_uint32 timeou 
    432473
    433474    return 0;
    434475#endif
     476*/
    435477}
    436478
    437479#endif
Note: See TracBrowser for help on using the repository browser.