comparison lphobos/std/c/windows/winsock.d @ 473:373489eeaf90

Applied downs' lphobos update
author Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
date Mon, 04 Aug 2008 19:28:49 +0200
parents
children
comparison
equal deleted inserted replaced
472:15c804b6ce77 473:373489eeaf90
1 /*
2 Written by Christopher E. Miller
3 Placed into public domain.
4 */
5
6
7 module std.c.windows.winsock;
8
9 private import std.stdint;
10 private import std.c.windows.windows;
11
12
13 extern(Windows):
14
15 alias UINT SOCKET;
16 alias int socklen_t;
17
18 const SOCKET INVALID_SOCKET = cast(SOCKET)~0;
19 const int SOCKET_ERROR = -1;
20
21 const int WSADESCRIPTION_LEN = 256;
22 const int WSASYS_STATUS_LEN = 128;
23
24 struct WSADATA
25 {
26 WORD wVersion;
27 WORD wHighVersion;
28 char szDescription[WSADESCRIPTION_LEN + 1];
29 char szSystemStatus[WSASYS_STATUS_LEN + 1];
30 USHORT iMaxSockets;
31 USHORT iMaxUdpDg;
32 char* lpVendorInfo;
33 }
34 alias WSADATA* LPWSADATA;
35
36
37 const int IOCPARM_MASK = 0x7F;
38 const int IOC_IN = cast(int)0x80000000;
39 const int FIONBIO = cast(int)(IOC_IN | ((UINT.sizeof & IOCPARM_MASK) << 16) | (102 << 8) | 126);
40
41
42 int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
43 int WSACleanup();
44 SOCKET socket(int af, int type, int protocol);
45 int ioctlsocket(SOCKET s, int cmd, uint* argp);
46 int bind(SOCKET s, sockaddr* name, int namelen);
47 int connect(SOCKET s, sockaddr* name, int namelen);
48 int listen(SOCKET s, int backlog);
49 SOCKET accept(SOCKET s, sockaddr* addr, int* addrlen);
50 int closesocket(SOCKET s);
51 int shutdown(SOCKET s, int how);
52 int getpeername(SOCKET s, sockaddr* name, int* namelen);
53 int getsockname(SOCKET s, sockaddr* name, int* namelen);
54 int send(SOCKET s, void* buf, int len, int flags);
55 int sendto(SOCKET s, void* buf, int len, int flags, sockaddr* to, int tolen);
56 int recv(SOCKET s, void* buf, int len, int flags);
57 int recvfrom(SOCKET s, void* buf, int len, int flags, sockaddr* from, int* fromlen);
58 int getsockopt(SOCKET s, int level, int optname, void* optval, int* optlen);
59 int setsockopt(SOCKET s, int level, int optname, void* optval, int optlen);
60 uint inet_addr(char* cp);
61 int select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* errorfds, timeval* timeout);
62 char* inet_ntoa(in_addr ina);
63 hostent* gethostbyname(char* name);
64 hostent* gethostbyaddr(void* addr, int len, int type);
65 protoent* getprotobyname(char* name);
66 protoent* getprotobynumber(int number);
67 servent* getservbyname(char* name, char* proto);
68 servent* getservbyport(int port, char* proto);
69 int gethostname(char* name, int namelen);
70 int getaddrinfo(char* nodename, char* servname, addrinfo* hints, addrinfo** res);
71 void freeaddrinfo(addrinfo* ai);
72 int getnameinfo(sockaddr* sa, socklen_t salen, char* host, DWORD hostlen, char* serv, DWORD servlen, int flags);
73
74 enum: int
75 {
76 WSAEWOULDBLOCK = 10035,
77 WSAEINTR = 10004,
78 WSAHOST_NOT_FOUND = 11001,
79 }
80
81 int WSAGetLastError();
82
83
84 enum: int
85 {
86 AF_UNSPEC = 0,
87
88 AF_UNIX = 1,
89 AF_INET = 2,
90 AF_IMPLINK = 3,
91 AF_PUP = 4,
92 AF_CHAOS = 5,
93 AF_NS = 6,
94 AF_IPX = AF_NS,
95 AF_ISO = 7,
96 AF_OSI = AF_ISO,
97 AF_ECMA = 8,
98 AF_DATAKIT = 9,
99 AF_CCITT = 10,
100 AF_SNA = 11,
101 AF_DECnet = 12,
102 AF_DLI = 13,
103 AF_LAT = 14,
104 AF_HYLINK = 15,
105 AF_APPLETALK = 16,
106 AF_NETBIOS = 17,
107 AF_VOICEVIEW = 18,
108 AF_FIREFOX = 19,
109 AF_UNKNOWN1 = 20,
110 AF_BAN = 21,
111 AF_ATM = 22,
112 AF_INET6 = 23,
113 AF_CLUSTER = 24,
114 AF_12844 = 25,
115 AF_IRDA = 26,
116 AF_NETDES = 28,
117
118 AF_MAX = 29,
119
120
121 PF_UNSPEC = AF_UNSPEC,
122
123 PF_UNIX = AF_UNIX,
124 PF_INET = AF_INET,
125 PF_IMPLINK = AF_IMPLINK,
126 PF_PUP = AF_PUP,
127 PF_CHAOS = AF_CHAOS,
128 PF_NS = AF_NS,
129 PF_IPX = AF_IPX,
130 PF_ISO = AF_ISO,
131 PF_OSI = AF_OSI,
132 PF_ECMA = AF_ECMA,
133 PF_DATAKIT = AF_DATAKIT,
134 PF_CCITT = AF_CCITT,
135 PF_SNA = AF_SNA,
136 PF_DECnet = AF_DECnet,
137 PF_DLI = AF_DLI,
138 PF_LAT = AF_LAT,
139 PF_HYLINK = AF_HYLINK,
140 PF_APPLETALK = AF_APPLETALK,
141 PF_VOICEVIEW = AF_VOICEVIEW,
142 PF_FIREFOX = AF_FIREFOX,
143 PF_UNKNOWN1 = AF_UNKNOWN1,
144 PF_BAN = AF_BAN,
145 PF_INET6 = AF_INET6,
146
147 PF_MAX = AF_MAX,
148 }
149
150
151 enum: int
152 {
153 SOL_SOCKET = 0xFFFF,
154 }
155
156
157 enum: int
158 {
159 SO_DEBUG = 0x0001,
160 SO_ACCEPTCONN = 0x0002,
161 SO_REUSEADDR = 0x0004,
162 SO_KEEPALIVE = 0x0008,
163 SO_DONTROUTE = 0x0010,
164 SO_BROADCAST = 0x0020,
165 SO_USELOOPBACK = 0x0040,
166 SO_LINGER = 0x0080,
167 SO_DONTLINGER = ~SO_LINGER,
168 SO_OOBINLINE = 0x0100,
169 SO_SNDBUF = 0x1001,
170 SO_RCVBUF = 0x1002,
171 SO_SNDLOWAT = 0x1003,
172 SO_RCVLOWAT = 0x1004,
173 SO_SNDTIMEO = 0x1005,
174 SO_RCVTIMEO = 0x1006,
175 SO_ERROR = 0x1007,
176 SO_TYPE = 0x1008,
177 SO_EXCLUSIVEADDRUSE = ~SO_REUSEADDR,
178
179 TCP_NODELAY = 1,
180
181 IP_MULTICAST_LOOP = 0x4,
182 IP_ADD_MEMBERSHIP = 0x5,
183 IP_DROP_MEMBERSHIP = 0x6,
184
185 IPV6_UNICAST_HOPS = 4,
186 IPV6_MULTICAST_IF = 9,
187 IPV6_MULTICAST_HOPS = 10,
188 IPV6_MULTICAST_LOOP = 11,
189 IPV6_ADD_MEMBERSHIP = 12,
190 IPV6_DROP_MEMBERSHIP = 13,
191 IPV6_JOIN_GROUP = IPV6_ADD_MEMBERSHIP,
192 IPV6_LEAVE_GROUP = IPV6_DROP_MEMBERSHIP,
193 }
194
195
196 const uint FD_SETSIZE = 64;
197
198
199 struct fd_set
200 {
201 UINT fd_count;
202 SOCKET[FD_SETSIZE] fd_array;
203 }
204
205
206 // Removes.
207 void FD_CLR(SOCKET fd, fd_set* set)
208 {
209 uint c = set.fd_count;
210 SOCKET* start = set.fd_array.ptr;
211 SOCKET* stop = start + c;
212
213 for(; start != stop; start++)
214 {
215 if(*start == fd)
216 goto found;
217 }
218 return; //not found
219
220 found:
221 for(++start; start != stop; start++)
222 {
223 *(start - 1) = *start;
224 }
225
226 set.fd_count = c - 1;
227 }
228
229
230 // Tests.
231 int FD_ISSET(SOCKET fd, fd_set* set)
232 {
233 SOCKET* start = set.fd_array.ptr;
234 SOCKET* stop = start + set.fd_count;
235
236 for(; start != stop; start++)
237 {
238 if(*start == fd)
239 return true;
240 }
241 return false;
242 }
243
244
245 // Adds.
246 void FD_SET(SOCKET fd, fd_set* set)
247 {
248 uint c = set.fd_count;
249 set.fd_array.ptr[c] = fd;
250 set.fd_count = c + 1;
251 }
252
253
254 // Resets to zero.
255 void FD_ZERO(fd_set* set)
256 {
257 set.fd_count = 0;
258 }
259
260
261 struct linger
262 {
263 USHORT l_onoff;
264 USHORT l_linger;
265 }
266
267
268 struct protoent
269 {
270 char* p_name;
271 char** p_aliases;
272 SHORT p_proto;
273 }
274
275
276 struct servent
277 {
278 char* s_name;
279 char** s_aliases;
280 SHORT s_port;
281 char* s_proto;
282 }
283
284
285 /+
286 union in6_addr
287 {
288 private union _u_t
289 {
290 BYTE[16] Byte;
291 WORD[8] Word;
292 }
293 _u_t u;
294 }
295
296
297 struct in_addr6
298 {
299 BYTE[16] s6_addr;
300 }
301 +/
302
303
304 version(BigEndian)
305 {
306 uint16_t htons(uint16_t x)
307 {
308 return x;
309 }
310
311
312 uint32_t htonl(uint32_t x)
313 {
314 return x;
315 }
316 }
317 else version(LittleEndian)
318 {
319 private import std.intrinsic;
320
321
322 uint16_t htons(uint16_t x)
323 {
324 return cast(uint16_t)((x >> 8) | (x << 8));
325 }
326
327
328 uint32_t htonl(uint32_t x)
329 {
330 return bswap(x);
331 }
332 }
333 else
334 {
335 static assert(0);
336 }
337
338
339 uint16_t ntohs(uint16_t x)
340 {
341 return htons(x);
342 }
343
344
345 uint32_t ntohl(uint32_t x)
346 {
347 return htonl(x);
348 }
349
350
351 enum: int
352 {
353 SOCK_STREAM = 1,
354 SOCK_DGRAM = 2,
355 SOCK_RAW = 3,
356 SOCK_RDM = 4,
357 SOCK_SEQPACKET = 5,
358 }
359
360
361 enum: int
362 {
363 IPPROTO_IP = 0,
364 IPPROTO_ICMP = 1,
365 IPPROTO_IGMP = 2,
366 IPPROTO_GGP = 3,
367 IPPROTO_TCP = 6,
368 IPPROTO_PUP = 12,
369 IPPROTO_UDP = 17,
370 IPPROTO_IDP = 22,
371 IPPROTO_IPV6 = 41,
372 IPPROTO_ND = 77,
373 IPPROTO_RAW = 255,
374
375 IPPROTO_MAX = 256,
376 }
377
378
379 enum: int
380 {
381 MSG_OOB = 0x1,
382 MSG_PEEK = 0x2,
383 MSG_DONTROUTE = 0x4,
384 MSG_NOSIGNAL = 0x0, /// not supported on win32, would be 0x4000 if it was
385 }
386
387
388 enum: int
389 {
390 SD_RECEIVE = 0,
391 SD_SEND = 1,
392 SD_BOTH = 2,
393 }
394
395
396 enum: uint
397 {
398 INADDR_ANY = 0,
399 INADDR_LOOPBACK = 0x7F000001,
400 INADDR_BROADCAST = 0xFFFFFFFF,
401 INADDR_NONE = 0xFFFFFFFF,
402 ADDR_ANY = INADDR_ANY,
403 }
404
405
406 enum: int
407 {
408 AI_PASSIVE = 0x1,
409 AI_CANONNAME = 0x2,
410 AI_NUMERICHOST = 0x4,
411 }
412
413
414 struct timeval
415 {
416 int32_t tv_sec;
417 int32_t tv_usec;
418 }
419
420
421 union in_addr
422 {
423 private union _S_un_t
424 {
425 private struct _S_un_b_t
426 {
427 uint8_t s_b1, s_b2, s_b3, s_b4;
428 }
429 _S_un_b_t S_un_b;
430
431 private struct _S_un_w_t
432 {
433 uint16_t s_w1, s_w2;
434 }
435 _S_un_w_t S_un_w;
436
437 uint32_t S_addr;
438 }
439 _S_un_t S_un;
440
441 uint32_t s_addr;
442
443 struct
444 {
445 uint8_t s_net, s_host;
446
447 union
448 {
449 uint16_t s_imp;
450
451 struct
452 {
453 uint8_t s_lh, s_impno;
454 }
455 }
456 }
457 }
458
459
460 union in6_addr
461 {
462 private union _in6_u_t
463 {
464 uint8_t[16] u6_addr8;
465 uint16_t[8] u6_addr16;
466 uint32_t[4] u6_addr32;
467 }
468 _in6_u_t in6_u;
469
470 uint8_t[16] s6_addr8;
471 uint16_t[8] s6_addr16;
472 uint32_t[4] s6_addr32;
473
474 alias s6_addr8 s6_addr;
475 }
476
477
478 const in6_addr IN6ADDR_ANY = { s6_addr8: [0] };
479 const in6_addr IN6ADDR_LOOPBACK = { s6_addr8: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1] };
480 //alias IN6ADDR_ANY IN6ADDR_ANY_INIT;
481 //alias IN6ADDR_LOOPBACK IN6ADDR_LOOPBACK_INIT;
482
483 const uint INET_ADDRSTRLEN = 16;
484 const uint INET6_ADDRSTRLEN = 46;
485
486
487 struct sockaddr
488 {
489 int16_t sa_family;
490 ubyte[14] sa_data;
491 }
492
493
494 struct sockaddr_in
495 {
496 int16_t sin_family = AF_INET;
497 uint16_t sin_port;
498 in_addr sin_addr;
499 ubyte[8] sin_zero;
500 }
501
502
503 struct sockaddr_in6
504 {
505 int16_t sin6_family = AF_INET6;
506 uint16_t sin6_port;
507 uint32_t sin6_flowinfo;
508 in6_addr sin6_addr;
509 uint32_t sin6_scope_id;
510 }
511
512
513 struct addrinfo
514 {
515 int32_t ai_flags;
516 int32_t ai_family;
517 int32_t ai_socktype;
518 int32_t ai_protocol;
519 size_t ai_addrlen;
520 char* ai_canonname;
521 sockaddr* ai_addr;
522 addrinfo* ai_next;
523 }
524
525
526 struct hostent
527 {
528 char* h_name;
529 char** h_aliases;
530 int16_t h_addrtype;
531 int16_t h_length;
532 char** h_addr_list;
533
534
535 char* h_addr()
536 {
537 return h_addr_list[0];
538 }
539 }
540