51
51
* POSSIBILITY OF SUCH DAMAGE.
52
52
*/
53
53
54
+ #ifdef _WIN32
55
+ # include <winsock2.h>
56
+ # include <ws2def.h>
57
+ # include <ws2tcpip.h>
58
+ # include <Windows.h>
59
+ # define socklen_t int
60
+ # define sockaddr_storage sockaddr
61
+ # define p_setsockopt_optval_t const char*
62
+ #else
63
+ # include <sys/socket.h>
64
+ # include <sys/un.h>
65
+ # include <netinet/in.h>
66
+ # include <netinet/tcp.h>
67
+ # include <arpa/inet.h>
68
+ # include <unistd.h>
69
+ # include <netdb.h>
70
+ # define p_setsockopt_optval_t void*
71
+ #endif
54
72
#include <sys/types.h>
55
- #include <sys/socket.h>
56
73
#include <sys/stat.h>
57
- #include <sys/un.h>
58
- #include <netinet/in.h>
59
- #include <netinet/tcp.h>
60
- #include <arpa/inet.h>
61
- #include <unistd.h>
62
74
#include <fcntl.h>
63
75
#include <string.h>
64
- #include <netdb.h>
76
+
65
77
#include <errno.h>
66
78
#include <stdarg.h>
67
79
#include <stdio.h>
@@ -80,6 +92,7 @@ static void anetSetError(char *err, const char *fmt, ...)
80
92
81
93
int anetNonBlock (char * err , int fd )
82
94
{
95
+ #if !defined(_WIN32 )
83
96
int flags ;
84
97
85
98
/* Set the socket nonblocking.
@@ -93,14 +106,21 @@ int anetNonBlock(char *err, int fd)
93
106
anetSetError (err , "fcntl(F_SETFL,O_NONBLOCK): %s" , strerror (errno ));
94
107
return ANET_ERR ;
95
108
}
96
-
109
+ #else
110
+ u_long mode = 1 ; // 1 to enable non-blocking socket
111
+ int errorCode = ioctlsocket (fd , FIONBIO , & mode );
112
+ if (errorCode != 0 ) {
113
+ anetSetError (err , "ioctlsocket(FIONBIO): %d" , errorCode );
114
+ return ANET_ERR ;
115
+ }
116
+ #endif
97
117
return ANET_OK ;
98
118
}
99
119
100
120
int anetTcpNoDelay (char * err , int fd )
101
121
{
102
122
int yes = 1 ;
103
- if (setsockopt (fd , IPPROTO_TCP , TCP_NODELAY , (void * )& yes , sizeof (yes )) == -1 )
123
+ if (setsockopt (fd , IPPROTO_TCP , TCP_NODELAY , (p_setsockopt_optval_t )& yes , sizeof (yes )) == -1 )
104
124
{
105
125
anetSetError (err , "setsockopt TCP_NODELAY: %s" , strerror (errno ));
106
126
return ANET_ERR ;
@@ -110,7 +130,7 @@ int anetTcpNoDelay(char *err, int fd)
110
130
111
131
int anetSetSendBuffer (char * err , int fd , int buffsize )
112
132
{
113
- if (setsockopt (fd , SOL_SOCKET , SO_SNDBUF , (void * )& buffsize , sizeof (buffsize )) == -1 )
133
+ if (setsockopt (fd , SOL_SOCKET , SO_SNDBUF , (p_setsockopt_optval_t )& buffsize , sizeof (buffsize )) == -1 )
114
134
{
115
135
anetSetError (err , "setsockopt SO_SNDBUF: %s" , strerror (errno ));
116
136
return ANET_ERR ;
@@ -121,7 +141,7 @@ int anetSetSendBuffer(char *err, int fd, int buffsize)
121
141
int anetTcpKeepAlive (char * err , int fd )
122
142
{
123
143
int yes = 1 ;
124
- if (setsockopt (fd , SOL_SOCKET , SO_KEEPALIVE , (void * )& yes , sizeof (yes )) == -1 ) {
144
+ if (setsockopt (fd , SOL_SOCKET , SO_KEEPALIVE , (p_setsockopt_optval_t )& yes , sizeof (yes )) == -1 ) {
125
145
anetSetError (err , "setsockopt SO_KEEPALIVE: %s" , strerror (errno ));
126
146
return ANET_ERR ;
127
147
}
@@ -138,7 +158,7 @@ static int anetCreateSocket(char *err, int domain)
138
158
139
159
/* Make sure connection-intensive things like the redis benckmark
140
160
* will be able to close/open sockets a zillion of times */
141
- if (setsockopt (s , SOL_SOCKET , SO_REUSEADDR , (void * )& on , sizeof (on )) == -1 ) {
161
+ if (setsockopt (s , SOL_SOCKET , SO_REUSEADDR , (p_setsockopt_optval_t )& on , sizeof (on )) == -1 ) {
142
162
anetSetError (err , "setsockopt SO_REUSEADDR: %s" , strerror (errno ));
143
163
return ANET_ERR ;
144
164
}
@@ -239,7 +259,7 @@ int anetWrite(int fd, char *buf, int count)
239
259
static int anetListen (char * err , int s , struct sockaddr * sa , socklen_t len ) {
240
260
if (sa -> sa_family == AF_INET6 ) {
241
261
int on = 1 ;
242
- setsockopt (s , IPPROTO_IPV6 , IPV6_V6ONLY , & on , sizeof (on ));
262
+ setsockopt (s , IPPROTO_IPV6 , IPV6_V6ONLY , ( p_setsockopt_optval_t ) & on , sizeof (on ));
243
263
}
244
264
245
265
if (bind (s ,sa ,len ) == -1 ) {
0 commit comments