ソースを参照

Initialise Win32 Socket API in _modbus_tcp_connect/_modbus_tcp_listen

Before using any functions of the Win32 Socket API we first have to
initialise it by calling WSAStartup(). Fixes non-working tests on native
Win32.

Signed-off-by: Stéphane Raimbault <stephane.raimbault@gmail.com>
Tobias Doerffel 14 年 前
コミット
7717e6c40c
1 ファイル変更26 行追加0 行削除
  1. 26 0
      src/modbus-tcp.c

+ 26 - 0
src/modbus-tcp.c

@@ -34,6 +34,26 @@
 #include "modbus-tcp.h"
 #include "modbus-tcp-private.h"
 
+static int _modbus_tcp_init()
+{
+#ifdef NATIVE_WIN32
+    // Initialise Win32 Socket API
+    WORD wVersionRequested;
+    WSADATA wsaData;
+
+    wVersionRequested = MAKEWORD(2, 0);
+    if (WSAStartup(wVersionRequested, &wsaData) != 0)
+    {
+        fprintf (stderr, "WSAStartup() returned error code %d\n",
+                 GetLastError());
+        errno = EIO;
+        return -1;
+    }
+#endif
+
+    return 0;
+}
+
 static int _modbus_set_slave(modbus_t *ctx, int slave)
 {
     if (slave >= 1 && slave <= 247) {
@@ -153,6 +173,10 @@ static int _modbus_tcp_connect(modbus_t *ctx)
     struct sockaddr_in addr;
     modbus_tcp_t *ctx_tcp = ctx->backend_data;
 
+    if (_modbus_tcp_init() == -1) {
+        return -1;
+    }
+
     ctx->s = socket(PF_INET, SOCK_STREAM, 0);
     if (ctx->s == -1) {
         return -1;
@@ -248,6 +272,8 @@ int _modbus_tcp_listen(modbus_t *ctx, int nb_connection)
     struct sockaddr_in addr;
     modbus_tcp_t *ctx_tcp = ctx->backend_data;
 
+    _modbus_tcp_init();
+
     new_socket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
     if (new_socket == -1) {
         return -1;