Преглед изворни кода

made network_tcp/udp ipv6 compatible (with ipv4 fallback)

Thomas Bender пре 7 година
родитељ
комит
18eca5369c
2 измењених фајлова са 12 додато и 10 уклоњено
  1. 6 6
      plugins/ua_network_tcp.c
  2. 6 4
      plugins/ua_network_udp.c

+ 6 - 6
plugins/ua_network_tcp.c

@@ -393,7 +393,7 @@ ServerNetworkLayerTCP_start(UA_ServerNetworkLayer *nl, UA_Logger logger) {
     UA_String_copy(&du, &nl->discoveryUrl);
 
     /* Create the server socket */
-    SOCKET newsock = socket(PF_INET, SOCK_STREAM, 0);
+    SOCKET newsock = socket(AF_INET6, SOCK_STREAM, 0);
 #ifdef _WIN32
     if(newsock == INVALID_SOCKET)
 #else
@@ -417,11 +417,11 @@ ServerNetworkLayerTCP_start(UA_ServerNetworkLayer *nl, UA_Logger logger) {
     }
 
     /* Bind socket to address */
-    struct sockaddr_in serv_addr;
-    serv_addr.sin_family = AF_INET;
-    serv_addr.sin_port = htons(layer->port);
-    serv_addr.sin_addr.s_addr = INADDR_ANY;
-    memset(&(serv_addr.sin_zero), '\0', 8);
+    struct sockaddr_in6 serv_addr;
+    memset(&serv_addr, 0, sizeof(serv_addr));
+    serv_addr.sin6_family = AF_INET6;
+    serv_addr.sin6_port = htons(layer->port);
+    serv_addr.sin6_addr = in6addr_any;
     if(bind(newsock, (const struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
         UA_LOG_WARNING(layer->logger, UA_LOGCATEGORY_NETWORK,
                        "Error during binding of the server socket");

+ 6 - 4
plugins/ua_network_udp.c

@@ -127,14 +127,16 @@ static void closeConnectionUDP(UA_Connection *handle) {
 static UA_StatusCode ServerNetworkLayerUDP_start(UA_ServerNetworkLayer *nl, UA_Logger logger) {
     ServerNetworkLayerUDP *layer = nl->handle;
     layer->logger = logger;
-    layer->serversockfd = socket(PF_INET, SOCK_DGRAM, 0);
+    layer->serversockfd = socket(AF_INET6, SOCK_DGRAM, 0);
     if(layer->serversockfd < 0) {
         UA_LOG_WARNING(layer->logger, UA_LOGCATEGORY_NETWORK, "Error opening socket");
         return UA_STATUSCODE_BADINTERNALERROR;
     }
-    const struct sockaddr_in serv_addr =
-        {.sin_family = AF_INET, .sin_addr.s_addr = INADDR_ANY,
-         .sin_port = htons(layer->port), .sin_zero = {0}};
+    struct sockaddr_in6 serv_addr;
+    memset(&serv_addr, 0, sizeof(serv_addr));
+    serv_addr.sin6_family = AF_INET6;
+    serv_addr.sin6_port = htons(layer->port);
+    serv_addr.sin6_addr = in6addr_any;
     int optval = 1;
     if(setsockopt(layer->serversockfd, SOL_SOCKET,
                   SO_REUSEADDR, (const char *)&optval, sizeof(optval)) == -1) {