Mercurial > projects > ldc
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 |