Jelajahi Sumber

!249 修改了socket包,增加了对_WIN32的支持。
Merge pull request !249 from SenySunny/master

李昂 2 tahun lalu
induk
melakukan
c3fafe00a9

+ 65 - 18
package/socket/PikaPlatform_socket.c

@@ -1,11 +1,46 @@
-#include "PikaPlatform_socket.h"
+#include "PikaPlatform_socket.h"
 /*
 /*
     The functinos start with PIKA_WEAK are weak functions,
     The functinos start with PIKA_WEAK are weak functions,
     you need to override them in your platform.
     you need to override them in your platform.
 */
 */
 
 
+#ifdef _WIN32
+#pragma comment(lib, "ws2_32.lib")
+
+static int pika_platform_winsock_initialized = 0;
+
+int pika_platform_init_winsock() {
+    if(0 == pika_platform_winsock_initialized) {
+        WSADATA wsaData;
+        int res = WSAStartup(MAKEWORD(2, 2), &wsaData);
+        if (res != 0) {
+            __platform_printf("WSAStartup failed with error: %d\n", res);
+            return 1;
+        }
+        pika_platform_winsock_initialized = 1;
+    }
+    else if(0 < pika_platform_winsock_initialized)
+    {
+        pika_platform_winsock_initialized++;
+    }
+    return 0;
+}
+
+int pika_platform_cleanup_winsock() {
+    if(1 == pika_platform_winsock_initialized) {
+        WSACleanup();
+        pika_platform_winsock_initialized = 0;
+    }
+    else if(1 < pika_platform_winsock_initialized)
+    {
+        pika_platform_winsock_initialized--;
+    }
+    return 0;
+}
+#endif
+
 PIKA_WEAK int pika_platform_socket(int __domain, int __type, int __protocol) {
 PIKA_WEAK int pika_platform_socket(int __domain, int __type, int __protocol) {
-#if defined(__linux__) || PIKA_LWIP_ENABLE
+#if defined(__linux__) || defined(_WIN32) || PIKA_LWIP_ENABLE
     return socket(__domain, __type, __protocol);
     return socket(__domain, __type, __protocol);
 #else
 #else
     WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
     WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
@@ -15,7 +50,7 @@ PIKA_WEAK int pika_platform_socket(int __domain, int __type, int __protocol) {
 PIKA_WEAK int pika_platform_bind(int __fd,
 PIKA_WEAK int pika_platform_bind(int __fd,
                                  const struct sockaddr* __addr,
                                  const struct sockaddr* __addr,
                                  socklen_t __addr_len) {
                                  socklen_t __addr_len) {
-#if defined(__linux__) || PIKA_LWIP_ENABLE
+#if defined(__linux__) || defined(_WIN32) || PIKA_LWIP_ENABLE
     return bind(__fd, __addr, __addr_len);
     return bind(__fd, __addr, __addr_len);
 #else
 #else
     WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
     WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
@@ -23,7 +58,7 @@ PIKA_WEAK int pika_platform_bind(int __fd,
 }
 }
 
 
 PIKA_WEAK int pika_platform_listen(int __fd, int __n) {
 PIKA_WEAK int pika_platform_listen(int __fd, int __n) {
-#if defined(__linux__) || PIKA_LWIP_ENABLE
+#if defined(__linux__) || defined(_WIN32) || PIKA_LWIP_ENABLE
     return listen(__fd, __n);
     return listen(__fd, __n);
 #else
 #else
     WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
     WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
@@ -33,7 +68,7 @@ PIKA_WEAK int pika_platform_listen(int __fd, int __n) {
 PIKA_WEAK int pika_platform_accept(int __fd,
 PIKA_WEAK int pika_platform_accept(int __fd,
                                    struct sockaddr* __addr,
                                    struct sockaddr* __addr,
                                    socklen_t* __addr_len) {
                                    socklen_t* __addr_len) {
-#if defined(__linux__) || PIKA_LWIP_ENABLE
+#if defined(__linux__) || defined(_WIN32) || PIKA_LWIP_ENABLE
     return accept(__fd, __addr, __addr_len);
     return accept(__fd, __addr, __addr_len);
 #else
 #else
     WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
     WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
@@ -43,7 +78,7 @@ PIKA_WEAK int pika_platform_accept(int __fd,
 PIKA_WEAK int pika_platform_connect(int __fd,
 PIKA_WEAK int pika_platform_connect(int __fd,
                                     const struct sockaddr* __addr,
                                     const struct sockaddr* __addr,
                                     socklen_t __addr_len) {
                                     socklen_t __addr_len) {
-#if defined(__linux__) || PIKA_LWIP_ENABLE
+#if defined(__linux__) || defined(_WIN32) || PIKA_LWIP_ENABLE
     return connect(__fd, __addr, __addr_len);
     return connect(__fd, __addr, __addr_len);
 #else
 #else
     WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
     WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
@@ -51,7 +86,7 @@ PIKA_WEAK int pika_platform_connect(int __fd,
 }
 }
 
 
 PIKA_WEAK int pika_platform_htons(int __hostshort) {
 PIKA_WEAK int pika_platform_htons(int __hostshort) {
-#if defined(__linux__) || PIKA_LWIP_ENABLE
+#if defined(__linux__) || defined(_WIN32) || PIKA_LWIP_ENABLE
     return htons(__hostshort);
     return htons(__hostshort);
 #else
 #else
     WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
     WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
@@ -60,7 +95,7 @@ PIKA_WEAK int pika_platform_htons(int __hostshort) {
 
 
 /* gethostbyname */
 /* gethostbyname */
 PIKA_WEAK struct hostent* pika_platform_gethostbyname(const char* __name) {
 PIKA_WEAK struct hostent* pika_platform_gethostbyname(const char* __name) {
-#if defined(__linux__) || PIKA_LWIP_ENABLE
+#if defined(__linux__) || defined(_WIN32) || PIKA_LWIP_ENABLE
     return gethostbyname(__name);
     return gethostbyname(__name);
 #else
 #else
     WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
     WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
@@ -68,9 +103,9 @@ PIKA_WEAK struct hostent* pika_platform_gethostbyname(const char* __name) {
 }
 }
 
 
 /* inet_ntoa */
 /* inet_ntoa */
-PIKA_WEAK char* pika_platform_inet_ntoa(struct in_addr __in) {
-#if defined(__linux__) || PIKA_LWIP_ENABLE
-    return inet_ntoa(__in);
+PIKA_WEAK char* pika_platform_inet_ntoa(struct in_addr in_addr_val) {
+#if defined(__linux__) || defined(_WIN32) || PIKA_LWIP_ENABLE
+    return inet_ntoa(in_addr_val);
 #else
 #else
     WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
     WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
 #endif
 #endif
@@ -80,7 +115,7 @@ PIKA_WEAK int pika_platform_send(int __fd,
                                  const void* __buf,
                                  const void* __buf,
                                  size_t __n,
                                  size_t __n,
                                  int __flags) {
                                  int __flags) {
-#if defined(__linux__) || PIKA_LWIP_ENABLE
+#if defined(__linux__) || defined(_WIN32) || PIKA_LWIP_ENABLE
     return send(__fd, __buf, __n, __flags);
     return send(__fd, __buf, __n, __flags);
 #else
 #else
     WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
     WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
@@ -91,7 +126,7 @@ PIKA_WEAK int pika_platform_recv(int __fd,
                                  void* __buf,
                                  void* __buf,
                                  size_t __n,
                                  size_t __n,
                                  int __flags) {
                                  int __flags) {
-#if defined(__linux__) || PIKA_LWIP_ENABLE
+#if defined(__linux__) || defined(_WIN32) || PIKA_LWIP_ENABLE
     return recv(__fd, __buf, __n, __flags);
     return recv(__fd, __buf, __n, __flags);
 #else
 #else
     WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
     WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
@@ -101,7 +136,7 @@ PIKA_WEAK int pika_platform_recv(int __fd,
 
 
 /* gethostname */
 /* gethostname */
 PIKA_WEAK int pika_platform_gethostname(char* __name, size_t __len) {
 PIKA_WEAK int pika_platform_gethostname(char* __name, size_t __len) {
-#if defined(__linux__)
+#if defined(__linux__) || defined(_WIN32)
     return gethostname(__name, __len);
     return gethostname(__name, __len);
 #else
 #else
     WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
     WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
@@ -113,7 +148,7 @@ PIKA_WEAK int pika_platform_getaddrinfo(const char* __name,
                                         const char* __service,
                                         const char* __service,
                                         const struct addrinfo* __req,
                                         const struct addrinfo* __req,
                                         struct addrinfo** __pai) {
                                         struct addrinfo** __pai) {
-#if defined(__linux__) || PIKA_LWIP_ENABLE
+#if defined(__linux__) || defined(_WIN32) || PIKA_LWIP_ENABLE
     return getaddrinfo(__name, __service, __req, __pai);
     return getaddrinfo(__name, __service, __req, __pai);
 #else
 #else
     WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
     WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
@@ -121,7 +156,7 @@ PIKA_WEAK int pika_platform_getaddrinfo(const char* __name,
 }
 }
 
 
 PIKA_WEAK void pika_platform_freeaddrinfo(struct addrinfo* __ai) {
 PIKA_WEAK void pika_platform_freeaddrinfo(struct addrinfo* __ai) {
-#if defined(__linux__) || PIKA_LWIP_ENABLE
+#if defined(__linux__) || defined(_WIN32) || PIKA_LWIP_ENABLE
     freeaddrinfo(__ai);
     freeaddrinfo(__ai);
 #else
 #else
     WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
     WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
@@ -133,7 +168,7 @@ PIKA_WEAK int pika_platform_setsockopt(int __fd,
                                        int __optname,
                                        int __optname,
                                        const void* __optval,
                                        const void* __optval,
                                        socklen_t __optlen) {
                                        socklen_t __optlen) {
-#if defined(__linux__) || PIKA_LWIP_ENABLE
+#if defined(__linux__) || defined(_WIN32) || PIKA_LWIP_ENABLE
     return setsockopt(__fd, __level, __optname, __optval, __optlen);
     return setsockopt(__fd, __level, __optname, __optval, __optlen);
 #else
 #else
     WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
     WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
@@ -143,6 +178,16 @@ PIKA_WEAK int pika_platform_setsockopt(int __fd,
 PIKA_WEAK int pika_platform_fcntl(int fd, int cmd, long arg) {
 PIKA_WEAK int pika_platform_fcntl(int fd, int cmd, long arg) {
 #if defined(__linux__) || PIKA_LWIP_ENABLE
 #if defined(__linux__) || PIKA_LWIP_ENABLE
     return fcntl(fd, cmd, arg);
     return fcntl(fd, cmd, arg);
+#elif defined(_WIN32)
+    if (cmd == F_GETFL) {
+       u_long mode = 0;
+       ioctlsocket(fd, FIONBIO, &mode);
+       return (mode ? O_NONBLOCK : 0);
+    } else if (cmd == F_SETFL) {
+       u_long mode = (arg & O_NONBLOCK) ? 1 : 0;
+       return ioctlsocket(fd, FIONBIO, &mode);
+    }
+    return -1;
 #else
 #else
     WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
     WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
 #endif
 #endif
@@ -152,6 +197,8 @@ PIKA_WEAK int pika_platform_fcntl(int fd, int cmd, long arg) {
 PIKA_WEAK int pika_platform_close(int __fd) {
 PIKA_WEAK int pika_platform_close(int __fd) {
 #if defined(__linux__) || PIKA_LWIP_ENABLE
 #if defined(__linux__) || PIKA_LWIP_ENABLE
     return close(__fd);
     return close(__fd);
+#elif defined(_WIN32)
+    return closesocket(__fd);
 #elif PIKA_FREERTOS_ENABLE
 #elif PIKA_FREERTOS_ENABLE
     return closesocket(__fd);
     return closesocket(__fd);
 #else
 #else
@@ -160,7 +207,7 @@ PIKA_WEAK int pika_platform_close(int __fd) {
 }
 }
 
 
 PIKA_WEAK int pika_platform_write(int __fd, const void* __buf, size_t __nbyte) {
 PIKA_WEAK int pika_platform_write(int __fd, const void* __buf, size_t __nbyte) {
-#if defined(__linux__) || PIKA_LWIP_ENABLE
+#if defined(__linux__) || defined(_WIN32) || PIKA_LWIP_ENABLE
     return write(__fd, __buf, __nbyte);
     return write(__fd, __buf, __nbyte);
 #else
 #else
     WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
     WEAK_FUNCTION_NEED_OVERRIDE_ERROR();

+ 19 - 2
package/socket/PikaPlatform_socket.h

@@ -1,4 +1,4 @@
-#include "PikaObj.h"
+#include "PikaObj.h"
 #ifdef __linux__
 #ifdef __linux__
 #include <arpa/inet.h>
 #include <arpa/inet.h>
 #include <errno.h>
 #include <errno.h>
@@ -6,6 +6,23 @@
 #include <netdb.h>
 #include <netdb.h>
 #include <sys/socket.h>
 #include <sys/socket.h>
 #include <unistd.h>
 #include <unistd.h>
+#elif _WIN32
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#endif
+#include <stdio.h>
+#include <windows.h>
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#include <iphlpapi.h>
+#include <io.h>
+#define O_NONBLOCK      0x0004  /* non blocking I/O, from BSD */
+
+#define F_GETFL  3
+#define F_SETFL  4
+
+int pika_platform_init_winsock();
+int pika_platform_cleanup_winsock();
 #elif PIKA_LWIP_ENABLE
 #elif PIKA_LWIP_ENABLE
 #include <lwip/sockets.h>
 #include <lwip/sockets.h>
 #include "lwip/api.h"
 #include "lwip/api.h"
@@ -46,7 +63,7 @@ int pika_platform_setsockopt(int __fd,
                              const void* __optval,
                              const void* __optval,
                              socklen_t __optlen);
                              socklen_t __optlen);
 int pika_platform_htons(int __hostshort);
 int pika_platform_htons(int __hostshort);
-char* pika_platform_inet_ntoa(struct in_addr __in);
+char* pika_platform_inet_ntoa(struct in_addr in_addr_val);
 struct hostent* pika_platform_gethostbyname(const char* __name);
 struct hostent* pika_platform_gethostbyname(const char* __name);
 
 
 /* os file API */
 /* os file API */

+ 20 - 2
package/socket/_socket.c

@@ -1,4 +1,4 @@
-#include "PikaPlatform_socket.h"
+#include "PikaPlatform_socket.h"
 #include "_socket_socket.h"
 #include "_socket_socket.h"
 
 
 #if !PIKASCRIPT_VERSION_REQUIRE_MINIMUN(1, 12, 0)
 #if !PIKASCRIPT_VERSION_REQUIRE_MINIMUN(1, 12, 0)
@@ -10,6 +10,9 @@ void _socket_socket__init(PikaObj* self) {
     int type = obj_getInt(self, "type");
     int type = obj_getInt(self, "type");
     int protocol = obj_getInt(self, "protocol");
     int protocol = obj_getInt(self, "protocol");
     int sockfd = 0;
     int sockfd = 0;
+#ifdef _WIN32
+    pika_platform_init_winsock();
+#endif
     sockfd = __platform_socket(family, type, protocol);
     sockfd = __platform_socket(family, type, protocol);
     if (sockfd < 0) {
     if (sockfd < 0) {
         obj_setErrorCode(self, PIKA_RES_ERR_RUNTIME_ERROR);
         obj_setErrorCode(self, PIKA_RES_ERR_RUNTIME_ERROR);
@@ -23,6 +26,9 @@ void _socket_socket__init(PikaObj* self) {
 void _socket_socket__close(PikaObj* self) {
 void _socket_socket__close(PikaObj* self) {
     int sockfd = obj_getInt(self, "sockfd");
     int sockfd = obj_getInt(self, "sockfd");
     __platform_close(sockfd);
     __platform_close(sockfd);
+#ifdef _WIN32
+    pika_platform_cleanup_winsock();
+#endif
 }
 }
 
 
 void _socket_socket__send(PikaObj* self, Arg* data) {
 void _socket_socket__send(PikaObj* self, Arg* data) {
@@ -161,13 +167,22 @@ void _socket_socket__bind(PikaObj* self, char* host, int port) {
 char* _socket__gethostname(PikaObj* self) {
 char* _socket__gethostname(PikaObj* self) {
     char hostname_buff[128] = {0};
     char hostname_buff[128] = {0};
     char* hostname = (char*)hostname_buff;
     char* hostname = (char*)hostname_buff;
-    __platform_gethostname(hostname_buff, 128);
+#ifdef _WIN32
+    pika_platform_init_winsock();
+#endif
+    pika_platform_gethostname(hostname_buff, 128);
+#ifdef _WIN32
+    pika_platform_cleanup_winsock();
+#endif
     return obj_cacheStr(self, hostname);
     return obj_cacheStr(self, hostname);
 }
 }
 
 
 char* _socket__gethostbyname(PikaObj *self, char* host){
 char* _socket__gethostbyname(PikaObj *self, char* host){
     struct hostent *host_entry;
     struct hostent *host_entry;
     char *ip = NULL;
     char *ip = NULL;
+#ifdef _WIN32
+    pika_platform_init_winsock();
+#endif
     host_entry = pika_platform_gethostbyname(host);
     host_entry = pika_platform_gethostbyname(host);
     if (host_entry == NULL) {
     if (host_entry == NULL) {
         obj_setErrorCode(self, PIKA_RES_ERR_RUNTIME_ERROR);
         obj_setErrorCode(self, PIKA_RES_ERR_RUNTIME_ERROR);
@@ -175,6 +190,9 @@ char* _socket__gethostbyname(PikaObj *self, char* host){
         return NULL;
         return NULL;
     }
     }
     ip = pika_platform_inet_ntoa(*((struct in_addr *)host_entry->h_addr_list[0]));
     ip = pika_platform_inet_ntoa(*((struct in_addr *)host_entry->h_addr_list[0]));
+#ifdef _WIN32
+    pika_platform_cleanup_winsock();
+#endif
     return obj_cacheStr(self, ip);
     return obj_cacheStr(self, ip);
 }
 }
 
 

+ 2 - 1
packages.toml

@@ -244,7 +244,8 @@ releases = [
   "v0.1.2 6898f52a71e3a43b3126a73487770370a4a7f02c",
   "v0.1.2 6898f52a71e3a43b3126a73487770370a4a7f02c",
   "v0.1.3 2aafbbdc84eed84edcf5dcd7462a842a14f26a92",
   "v0.1.3 2aafbbdc84eed84edcf5dcd7462a842a14f26a92",
   "v0.1.4 b9a0109c6125d16270cf02b2a07421a4baf9973c",
   "v0.1.4 b9a0109c6125d16270cf02b2a07421a4baf9973c",
-  "v0.1.5 e74c15979a84615a921447b98c79e35de83a8427"
+  "v0.1.5 e74c15979a84615a921447b98c79e35de83a8427",
+  "v0.1.6 a2edd3958486dcd15d323663065155645c632c5d"
 ]
 ]
 
 
 [[packages]]
 [[packages]]