a87ddab0bdee4284e37a10a81545b69933aaf8e2
2 #include "pipe/p_compiler.h"
3 #include "util/u_network.h"
4 #include "util/u_debug.h"
5 #include "util/u_string.h"
8 #if defined(PIPE_OS_WINDOWS)
11 # include <ws2tcpip.h>
12 #elif defined(PIPE_OS_UNIX)
13 # include <sys/socket.h>
14 # include <netinet/in.h>
19 # warning "No socket implementation"
25 #if defined(PIPE_OS_WINDOWS)
26 WORD wVersionRequested
;
30 /* Use the MAKEWORD(lowbyte, highbyte) macro declared in Windef.h */
31 wVersionRequested
= MAKEWORD(1, 1);
33 err
= WSAStartup(wVersionRequested
, &wsaData
);
35 debug_printf("WSAStartup failed with error: %d\n", err
);
39 #elif defined(PIPE_HAVE_SOCKETS)
49 #if defined(PIPE_OS_WINDOWS)
60 #if defined(PIPE_OS_UNIX)
61 shutdown(s
, SHUT_RDWR
);
63 #elif defined(PIPE_OS_WINDOWS)
71 int u_socket_accept(int s
)
73 #if defined(PIPE_HAVE_SOCKETS)
74 return accept(s
, NULL
, NULL
);
81 u_socket_send(int s
, void *data
, size_t size
)
83 #if defined(PIPE_HAVE_SOCKETS)
84 return send(s
, data
, size
, 0);
91 u_socket_peek(int s
, void *data
, size_t size
)
93 #if defined(PIPE_HAVE_SOCKETS)
94 return recv(s
, data
, size
, MSG_PEEK
);
101 u_socket_recv(int s
, void *data
, size_t size
)
103 #if defined(PIPE_HAVE_SOCKETS)
104 return recv(s
, data
, size
, 0);
111 u_socket_connect(const char *hostname
, uint16_t port
)
113 #if defined(PIPE_HAVE_SOCKETS)
115 struct addrinfo hints
, *addr
;
118 memset(&hints
, 0, sizeof hints
);
119 hints
.ai_family
= AF_UNSPEC
; // AF_INET or AF_INET6 to force version
120 hints
.ai_socktype
= SOCK_STREAM
;
122 snprintf(portString
, sizeof(portString
), "%d", port
);
124 r
= getaddrinfo(hostname
, portString
, NULL
, &addr
);
129 s
= socket(addr
->ai_family
, SOCK_STREAM
, IPPROTO_TCP
);
135 if (connect(s
, addr
->ai_addr
, (int) addr
->ai_addrlen
)) {
151 u_socket_listen_on_port(uint16_t portnum
)
153 #if defined(PIPE_HAVE_SOCKETS)
155 struct sockaddr_in sa
;
156 memset(&sa
, 0, sizeof(struct sockaddr_in
));
158 sa
.sin_family
= AF_INET
;
159 sa
.sin_port
= htons(portnum
);
161 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
165 if (bind(s
, (struct sockaddr
*)&sa
, sizeof(struct sockaddr_in
)) == -1) {
180 u_socket_block(int s
, boolean block
)
182 #if defined(PIPE_OS_UNIX)
183 int old
= fcntl(s
, F_GETFL
, 0);
187 /* TODO obey block */
189 fcntl(s
, F_SETFL
, old
& ~O_NONBLOCK
);
191 fcntl(s
, F_SETFL
, old
| O_NONBLOCK
);
192 #elif defined(PIPE_OS_WINDOWS)
193 u_long iMode
= block
? 0 : 1;
194 ioctlsocket(s
, FIONBIO
, &iMode
);