|
|
1.1 root 1: // net_wins.c
2:
3: #include "winsock.h"
4: #include "wsipx.h"
5: #include "../qcommon/qcommon.h"
6:
7: #define MAX_LOOPBACK 4
8:
9: typedef struct
10: {
11: byte data[MAX_MSGLEN];
12: int datalen;
13: } loopmsg_t;
14:
15: typedef struct
16: {
17: loopmsg_t msgs[MAX_LOOPBACK];
18: int get, send;
19: } loopback_t;
20:
21:
22: cvar_t *net_shownet;
23: static cvar_t *noudp;
24: static cvar_t *noipx;
25:
26: loopback_t loopbacks[2];
27: int ip_sockets[2];
28: int ipx_sockets[2];
29:
30: char *NET_ErrorString (void);
31:
32: //=============================================================================
33:
34: void NetadrToSockadr (netadr_t *a, struct sockaddr *s)
35: {
36: memset (s, 0, sizeof(*s));
37:
38: if (a->type == NA_BROADCAST)
39: {
40: ((struct sockaddr_in *)s)->sin_family = AF_INET;
41: ((struct sockaddr_in *)s)->sin_port = a->port;
42: ((struct sockaddr_in *)s)->sin_addr.s_addr = INADDR_BROADCAST;
43: }
44: else if (a->type == NA_IP)
45: {
46: ((struct sockaddr_in *)s)->sin_family = AF_INET;
47: ((struct sockaddr_in *)s)->sin_addr.s_addr = *(int *)&a->ip;
48: ((struct sockaddr_in *)s)->sin_port = a->port;
49: }
50: else if (a->type == NA_IPX)
51: {
52: ((struct sockaddr_ipx *)s)->sa_family = AF_IPX;
53: memcpy(((struct sockaddr_ipx *)s)->sa_netnum, &a->ipx[0], 4);
54: memcpy(((struct sockaddr_ipx *)s)->sa_nodenum, &a->ipx[4], 6);
55: ((struct sockaddr_ipx *)s)->sa_socket = a->port;
56: }
57: else if (a->type == NA_BROADCAST_IPX)
58: {
59: ((struct sockaddr_ipx *)s)->sa_family = AF_IPX;
60: memset(((struct sockaddr_ipx *)s)->sa_netnum, 0, 4);
61: memset(((struct sockaddr_ipx *)s)->sa_nodenum, 0xff, 6);
62: ((struct sockaddr_ipx *)s)->sa_socket = a->port;
63: }
64: }
65:
66: void SockadrToNetadr (struct sockaddr *s, netadr_t *a)
67: {
68: if (s->sa_family == AF_INET)
69: {
70: a->type = NA_IP;
71: *(int *)&a->ip = ((struct sockaddr_in *)s)->sin_addr.s_addr;
72: a->port = ((struct sockaddr_in *)s)->sin_port;
73: }
74: else if (s->sa_family == AF_IPX)
75: {
76: a->type = NA_IPX;
77: memcpy(&a->ipx[0], ((struct sockaddr_ipx *)s)->sa_netnum, 4);
78: memcpy(&a->ipx[4], ((struct sockaddr_ipx *)s)->sa_nodenum, 6);
79: a->port = ((struct sockaddr_ipx *)s)->sa_socket;
80: }
81: }
82:
83:
84: qboolean NET_CompareAdr (netadr_t a, netadr_t b)
85: {
86: if (a.type != b.type)
87: return false;
88:
89: if (a.type == NA_LOOPBACK)
90: return TRUE;
91:
92: if (a.type == NA_IP)
93: {
94: if (a.ip[0] == b.ip[0] && a.ip[1] == b.ip[1] && a.ip[2] == b.ip[2] && a.ip[3] == b.ip[3] && a.port == b.port)
95: return true;
96: return false;
97: }
98:
99: if (a.type == NA_IPX)
100: {
101: if ((memcmp(a.ipx, b.ipx, 10) == 0) && a.port == b.port)
102: return true;
103: return false;
104: }
105: }
106:
107: /*
108: ===================
109: NET_CompareBaseAdr
110:
111: Compares without the port
112: ===================
113: */
114: qboolean NET_CompareBaseAdr (netadr_t a, netadr_t b)
115: {
116: if (a.type != b.type)
117: return false;
118:
119: if (a.type == NA_LOOPBACK)
120: return TRUE;
121:
122: if (a.type == NA_IP)
123: {
124: if (a.ip[0] == b.ip[0] && a.ip[1] == b.ip[1] && a.ip[2] == b.ip[2] && a.ip[3] == b.ip[3])
125: return true;
126: return false;
127: }
128:
129: if (a.type == NA_IPX)
130: {
131: if ((memcmp(a.ipx, b.ipx, 10) == 0))
132: return true;
133: return false;
134: }
135: }
136:
137: char *NET_AdrToString (netadr_t a)
138: {
139: static char s[64];
140:
141: if (a.type == NA_LOOPBACK)
142: Com_sprintf (s, sizeof(s), "loopback");
143: else if (a.type == NA_IP)
144: Com_sprintf (s, sizeof(s), "%i.%i.%i.%i:%i", a.ip[0], a.ip[1], a.ip[2], a.ip[3], ntohs(a.port));
145: else
146: Com_sprintf (s, sizeof(s), "%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x:%i", a.ipx[0], a.ipx[1], a.ipx[2], a.ipx[3], a.ipx[4], a.ipx[5], a.ipx[6], a.ipx[7], a.ipx[8], a.ipx[9], ntohs(a.port));
147:
148: return s;
149: }
150:
151:
152: /*
153: =============
154: NET_StringToAdr
155:
156: localhost
157: idnewt
158: idnewt:28000
159: 192.246.40.70
160: 192.246.40.70:28000
161: =============
162: */
163: #define DO(src,dest) \
164: copy[0] = s[src]; \
165: copy[1] = s[src + 1]; \
166: sscanf (copy, "%x", &val); \
167: ((struct sockaddr_ipx *)sadr)->dest = val
168:
169: qboolean NET_StringToSockaddr (char *s, struct sockaddr *sadr)
170: {
171: struct hostent *h;
172: char *colon;
173: int val;
174: char copy[128];
175:
176: memset (sadr, 0, sizeof(*sadr));
177:
178: if ((strlen(s) >= 23) && (s[8] == ':') && (s[21] == ':')) // check for an IPX address
179: {
180: ((struct sockaddr_ipx *)sadr)->sa_family = AF_IPX;
181: copy[2] = 0;
182: DO(0, sa_netnum[0]);
183: DO(2, sa_netnum[1]);
184: DO(4, sa_netnum[2]);
185: DO(6, sa_netnum[3]);
186: DO(9, sa_nodenum[0]);
187: DO(11, sa_nodenum[1]);
188: DO(13, sa_nodenum[2]);
189: DO(15, sa_nodenum[3]);
190: DO(17, sa_nodenum[4]);
191: DO(19, sa_nodenum[5]);
192: sscanf (&s[22], "%u", &val);
193: ((struct sockaddr_ipx *)sadr)->sa_socket = htons((unsigned short)val);
194: }
195: else
196: {
197: ((struct sockaddr_in *)sadr)->sin_family = AF_INET;
198:
199: ((struct sockaddr_in *)sadr)->sin_port = 0;
200:
201: strcpy (copy, s);
202: // strip off a trailing :port if present
203: for (colon = copy ; *colon ; colon++)
204: if (*colon == ':')
205: {
206: *colon = 0;
207: ((struct sockaddr_in *)sadr)->sin_port = htons((short)atoi(colon+1));
208: }
209:
210: if (copy[0] >= '0' && copy[0] <= '9')
211: {
212: *(int *)&((struct sockaddr_in *)sadr)->sin_addr = inet_addr(copy);
213: }
214: else
215: {
216: if (! (h = gethostbyname(copy)) )
217: return 0;
218: *(int *)&((struct sockaddr_in *)sadr)->sin_addr = *(int *)h->h_addr_list[0];
219: }
220: }
221:
222: return true;
223: }
224:
225: #undef DO
226:
227: /*
228: =============
229: NET_StringToAdr
230:
231: localhost
232: idnewt
233: idnewt:28000
234: 192.246.40.70
235: 192.246.40.70:28000
236: =============
237: */
238: qboolean NET_StringToAdr (char *s, netadr_t *a)
239: {
240: struct sockaddr sadr;
241:
242: if (!strcmp (s, "localhost"))
243: {
244: memset (a, 0, sizeof(*a));
245: a->type = NA_LOOPBACK;
246: return true;
247: }
248:
249: if (!NET_StringToSockaddr (s, &sadr))
250: return false;
251:
252: SockadrToNetadr (&sadr, a);
253:
254: return true;
255: }
256:
257:
258: qboolean NET_IsLocalAddress (netadr_t adr)
259: {
260: return adr.type == NA_LOOPBACK;
261: }
262:
263: /*
264: =============================================================================
265:
266: LOOPBACK BUFFERS FOR LOCAL PLAYER
267:
268: =============================================================================
269: */
270:
271: qboolean NET_GetLoopPacket (netsrc_t sock, netadr_t *net_from, sizebuf_t *net_message)
272: {
273: int i;
274: loopback_t *loop;
275:
276: loop = &loopbacks[sock];
277:
278: if (loop->send - loop->get > MAX_LOOPBACK)
279: loop->get = loop->send - MAX_LOOPBACK;
280:
281: if (loop->get >= loop->send)
282: return false;
283:
284: i = loop->get & (MAX_LOOPBACK-1);
285: loop->get++;
286:
287: memcpy (net_message->data, loop->msgs[i].data, loop->msgs[i].datalen);
288: net_message->cursize = loop->msgs[i].datalen;
289: memset (net_from, 0, sizeof(*net_from));
290: net_from->type = NA_LOOPBACK;
291: return true;
292:
293: }
294:
295:
296: void NET_SendLoopPacket (netsrc_t sock, int length, void *data, netadr_t to)
297: {
298: int i;
299: loopback_t *loop;
300:
301: loop = &loopbacks[sock^1];
302:
303: i = loop->send & (MAX_LOOPBACK-1);
304: loop->send++;
305:
306: memcpy (loop->msgs[i].data, data, length);
307: loop->msgs[i].datalen = length;
308: }
309:
310: //=============================================================================
311:
312: qboolean NET_GetPacket (netsrc_t sock, netadr_t *net_from, sizebuf_t *net_message)
313: {
314: int ret;
315: struct sockaddr from;
316: int fromlen;
317: int net_socket;
318: int protocol;
319: int err;
320:
321: if (NET_GetLoopPacket (sock, net_from, net_message))
322: return true;
323:
324: for (protocol = 0 ; protocol < 2 ; protocol++)
325: {
326: if (protocol == 0)
327: net_socket = ip_sockets[sock];
328: else
329: net_socket = ipx_sockets[sock];
330:
331: if (!net_socket)
332: continue;
333:
334: fromlen = sizeof(from);
335: ret = recvfrom (net_socket, net_message->data, net_message->maxsize
336: , 0, (struct sockaddr *)&from, &fromlen);
337: if (ret == -1)
338: {
339: err = WSAGetLastError();
340:
341: if (err == WSAEWOULDBLOCK)
342: continue;
343: if (dedicated->value) // let dedicated servers continue after errors
344: Com_Printf ("NET_GetPacket: %s", NET_ErrorString());
345: else
346: Com_Error (ERR_DROP, "NET_GetPacket: %s", NET_ErrorString());
347: continue;
348: }
349:
350: SockadrToNetadr (&from, net_from);
351:
352: if (ret == net_message->maxsize)
353: {
354: Com_Printf ("Oversize packet from %s\n", NET_AdrToString (*net_from));
355: continue;
356: }
357:
358: net_message->cursize = ret;
359: return true;
360: }
361:
362: return false;
363: }
364:
365: //=============================================================================
366:
367: void NET_SendPacket (netsrc_t sock, int length, void *data, netadr_t to)
368: {
369: int ret;
370: struct sockaddr addr;
371: int net_socket;
372:
373: if ( to.type == NA_LOOPBACK )
374: {
375: NET_SendLoopPacket (sock, length, data, to);
376: return;
377: }
378:
379: if (to.type == NA_BROADCAST)
380: {
381: net_socket = ip_sockets[sock];
382: if (!net_socket)
383: return;
384: }
385: else if (to.type == NA_IP)
386: {
387: net_socket = ip_sockets[sock];
388: if (!net_socket)
389: return;
390: }
391: else if (to.type == NA_IPX)
392: {
393: net_socket = ipx_sockets[sock];
394: if (!net_socket)
395: return;
396: }
397: else if (to.type == NA_BROADCAST_IPX)
398: {
399: net_socket = ipx_sockets[sock];
400: if (!net_socket)
401: return;
402: }
403: else
404: Com_Error (ERR_FATAL, "NET_SendPacket: bad address type");
405:
406: NetadrToSockadr (&to, &addr);
407:
408: ret = sendto (net_socket, data, length, 0, &addr, sizeof(addr) );
409: if (ret == -1)
410: {
411: int err = WSAGetLastError();
412:
413: // wouldblock is silent
414: if (err == WSAEWOULDBLOCK)
415: return;
416:
417: // some PPP links dont allow broadcasts
418: if ((err == WSAEADDRNOTAVAIL) && ((to.type == NA_BROADCAST) || (to.type == NA_BROADCAST_IPX)))
419: return;
420:
421: if (dedicated->value) // let dedicated servers continue after errors
422: {
423: Com_Printf ("NET_SendPacket ERROR: %s\n", NET_ErrorString());
424: }
425: else
426: {
427: if (err == WSAEADDRNOTAVAIL)
428: {
429: Com_DPrintf ("NET_SendPacket Warning: %s : %s\n", NET_ErrorString(), NET_AdrToString (to));
430: }
431: else
432: {
433: Com_Error (ERR_DROP, "NET_SendPacket ERROR: %s\n", NET_ErrorString());
434: }
435: }
436: }
437: }
438:
439:
440: //=============================================================================
441:
442:
443: /*
444: ====================
445: NET_Socket
446: ====================
447: */
448: int NET_IPSocket (char *net_interface, int port)
449: {
450: int newsocket;
451: struct sockaddr_in address;
452: qboolean _true = true;
453: int i = 1;
454: int err;
455:
456: if ((newsocket = socket (PF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
457: {
458: err = WSAGetLastError();
459: if (err != WSAEAFNOSUPPORT)
460: Com_Printf ("WARNING: UDP_OpenSocket: socket: %s", NET_ErrorString());
461: return 0;
462: }
463:
464: // make it non-blocking
465: if (ioctlsocket (newsocket, FIONBIO, &_true) == -1)
466: {
467: Com_Printf ("WARNING: UDP_OpenSocket: ioctl FIONBIO: %s\n", NET_ErrorString());
468: return 0;
469: }
470:
471: // make it broadcast capable
472: if (setsockopt(newsocket, SOL_SOCKET, SO_BROADCAST, (char *)&i, sizeof(i)) == -1)
473: {
474: Com_Printf ("WARNING: UDP_OpenSocket: setsockopt SO_BROADCAST: %s\n", NET_ErrorString());
475: return 0;
476: }
477:
478: if (!net_interface || !net_interface[0] || !stricmp(net_interface, "localhost"))
479: address.sin_addr.s_addr = INADDR_ANY;
480: else
481: NET_StringToSockaddr (net_interface, (struct sockaddr *)&address);
482:
483: if (port == PORT_ANY)
484: address.sin_port = 0;
485: else
486: address.sin_port = htons((short)port);
487:
488: address.sin_family = AF_INET;
489:
490: if( bind (newsocket, (void *)&address, sizeof(address)) == -1)
491: {
492: Com_Printf ("WARNING: UDP_OpenSocket: bind: %s\n", NET_ErrorString());
493: closesocket (newsocket);
494: return 0;
495: }
496:
497: return newsocket;
498: }
499:
500:
501: /*
502: ====================
503: NET_OpenIP
504: ====================
505: */
506: void NET_OpenIP (void)
507: {
508: cvar_t *ip;
509: int port;
510: int dedicated;
511:
512: ip = Cvar_Get ("ip", "localhost", CVAR_NOSET);
513:
514: dedicated = Cvar_VariableValue ("dedicated");
515:
516: if (!ip_sockets[NS_SERVER])
517: {
518: port = Cvar_Get("ip_hostport", "0", CVAR_NOSET)->value;
519: if (!port)
520: {
521: port = Cvar_Get("hostport", "0", CVAR_NOSET)->value;
522: if (!port)
523: {
524: port = Cvar_Get("port", va("%i", PORT_SERVER), CVAR_NOSET)->value;
525: }
526: }
527: ip_sockets[NS_SERVER] = NET_IPSocket (ip->string, port);
528: if (!ip_sockets[NS_SERVER] && dedicated)
529: Com_Error (ERR_FATAL, "Couldn't allocate dedicated server IP port");
530: }
531:
532:
533: // dedicated servers don't need client ports
534: if (dedicated)
535: return;
536:
537: if (!ip_sockets[NS_CLIENT])
538: {
539: port = Cvar_Get("ip_clientport", "0", CVAR_NOSET)->value;
540: if (!port)
541: {
542: port = Cvar_Get("clientport", va("%i", PORT_CLIENT), CVAR_NOSET)->value;
543: if (!port)
544: port = PORT_ANY;
545: }
546: ip_sockets[NS_CLIENT] = NET_IPSocket (ip->string, port);
547: if (!ip_sockets[NS_CLIENT])
548: ip_sockets[NS_CLIENT] = NET_IPSocket (ip->string, PORT_ANY);
549: }
550: }
551:
552:
553: /*
554: ====================
555: IPX_Socket
556: ====================
557: */
558: int NET_IPXSocket (int port)
559: {
560: int newsocket;
561: struct sockaddr_ipx address;
562: int _true = 1;
563: int err;
564:
565: if ((newsocket = socket (PF_IPX, SOCK_DGRAM, NSPROTO_IPX)) == -1)
566: {
567: err = WSAGetLastError();
568: if (err != WSAEAFNOSUPPORT)
569: Com_Printf ("WARNING: IPX_Socket: socket: %s\n", NET_ErrorString());
570: return 0;
571: }
572:
573: // make it non-blocking
574: if (ioctlsocket (newsocket, FIONBIO, &_true) == -1)
575: {
576: Com_Printf ("WARNING: IPX_Socket: ioctl FIONBIO: %s\n", NET_ErrorString());
577: return 0;
578: }
579:
580: // make it broadcast capable
581: if (setsockopt(newsocket, SOL_SOCKET, SO_BROADCAST, (char *)&_true, sizeof(_true)) == -1)
582: {
583: Com_Printf ("WARNING: IPX_Socket: setsockopt SO_BROADCAST: %s\n", NET_ErrorString());
584: return 0;
585: }
586:
587: address.sa_family = AF_IPX;
588: memset (address.sa_netnum, 0, 4);
589: memset (address.sa_nodenum, 0, 6);
590: if (port == PORT_ANY)
591: address.sa_socket = 0;
592: else
593: address.sa_socket = htons((short)port);
594:
595: if( bind (newsocket, (void *)&address, sizeof(address)) == -1)
596: {
597: Com_Printf ("WARNING: IPX_Socket: bind: %s\n", NET_ErrorString());
598: closesocket (newsocket);
599: return 0;
600: }
601:
602: return newsocket;
603: }
604:
605:
606: /*
607: ====================
608: NET_OpenIPX
609: ====================
610: */
611: void NET_OpenIPX (void)
612: {
613: int port;
614: int dedicated;
615:
616: dedicated = Cvar_VariableValue ("dedicated");
617:
618: if (!ipx_sockets[NS_SERVER])
619: {
620: port = Cvar_Get("ipx_hostport", "0", CVAR_NOSET)->value;
621: if (!port)
622: {
623: port = Cvar_Get("hostport", "0", CVAR_NOSET)->value;
624: if (!port)
625: {
626: port = Cvar_Get("port", va("%i", PORT_SERVER), CVAR_NOSET)->value;
627: }
628: }
629: ipx_sockets[NS_SERVER] = NET_IPXSocket (port);
630: }
631:
632: // dedicated servers don't need client ports
633: if (dedicated)
634: return;
635:
636: if (!ipx_sockets[NS_CLIENT])
637: {
638: port = Cvar_Get("ipx_clientport", "0", CVAR_NOSET)->value;
639: if (!port)
640: {
641: port = Cvar_Get("clientport", va("%i", PORT_CLIENT), CVAR_NOSET)->value;
642: if (!port)
643: port = PORT_ANY;
644: }
645: ipx_sockets[NS_CLIENT] = NET_IPXSocket (port);
646: if (!ipx_sockets[NS_CLIENT])
647: ipx_sockets[NS_CLIENT] = NET_IPXSocket (PORT_ANY);
648: }
649: }
650:
651:
652: /*
653: ====================
654: NET_Config
655:
656: A single player game will only use the loopback code
657: ====================
658: */
659: void NET_Config (qboolean multiplayer)
660: {
661: int i;
662: static qboolean old_config;
663:
664: if (old_config == multiplayer)
665: return;
666:
667: old_config = multiplayer;
668:
669: if (!multiplayer)
670: { // shut down any existing sockets
671: for (i=0 ; i<2 ; i++)
672: {
673: if (ip_sockets[i])
674: {
675: closesocket (ip_sockets[i]);
676: ip_sockets[i] = 0;
677: }
678: if (ipx_sockets[i])
679: {
680: closesocket (ipx_sockets[i]);
681: ipx_sockets[i] = 0;
682: }
683: }
684: }
685: else
686: { // open sockets
687: if (! noudp->value)
688: NET_OpenIP ();
689: if (! noipx->value)
690: NET_OpenIPX ();
691: }
692: }
693:
1.1.1.2 ! root 694: // sleeps msec or until net socket is ready
! 695: void NET_Sleep(int msec)
! 696: {
! 697: struct timeval timeout;
! 698: fd_set fdset;
! 699: extern cvar_t *dedicated;
! 700: int i;
! 701:
! 702: if (!dedicated || !dedicated->value)
! 703: return; // we're not a server, just run full speed
! 704:
! 705: FD_ZERO(&fdset);
! 706: i = 0;
! 707: if (ip_sockets[NS_SERVER]) {
! 708: FD_SET(ip_sockets[NS_SERVER], &fdset); // network socket
! 709: i = ip_sockets[NS_SERVER];
! 710: }
! 711: if (ipx_sockets[NS_SERVER]) {
! 712: FD_SET(ipx_sockets[NS_SERVER], &fdset); // network socket
! 713: if (ipx_sockets[NS_SERVER] > i)
! 714: i = ipx_sockets[NS_SERVER];
! 715: }
! 716: timeout.tv_sec = msec/1000;
! 717: timeout.tv_usec = (msec%1000)*1000;
! 718: select(i+1, &fdset, NULL, NULL, &timeout);
! 719: }
1.1 root 720:
721: //===================================================================
722:
723:
724: static WSADATA winsockdata;
725:
726: /*
727: ====================
728: NET_Init
729: ====================
730: */
731: void NET_Init (void)
732: {
733: WORD wVersionRequested;
734: int r;
735:
736: wVersionRequested = MAKEWORD(1, 1);
737:
738: r = WSAStartup (MAKEWORD(1, 1), &winsockdata);
739:
740: if (r)
741: Com_Error (ERR_FATAL,"Winsock initialization failed.");
742:
743: Com_Printf("Winsock Initialized\n");
744:
745: noudp = Cvar_Get ("noudp", "0", CVAR_NOSET);
746: noipx = Cvar_Get ("noipx", "0", CVAR_NOSET);
747:
748: net_shownet = Cvar_Get ("net_shownet", "0", 0);
749: }
750:
751:
752: /*
753: ====================
754: NET_Shutdown
755: ====================
756: */
757: void NET_Shutdown (void)
758: {
759: NET_Config (false); // close sockets
760:
761: WSACleanup ();
762: }
763:
764:
765: /*
766: ====================
767: NET_ErrorString
768: ====================
769: */
770: char *NET_ErrorString (void)
771: {
772: int code;
773:
774: code = WSAGetLastError ();
775: switch (code)
776: {
777: case WSAEINTR: return "WSAEINTR";
778: case WSAEBADF: return "WSAEBADF";
779: case WSAEACCES: return "WSAEACCES";
780: case WSAEDISCON: return "WSAEDISCON";
781: case WSAEFAULT: return "WSAEFAULT";
782: case WSAEINVAL: return "WSAEINVAL";
783: case WSAEMFILE: return "WSAEMFILE";
784: case WSAEWOULDBLOCK: return "WSAEWOULDBLOCK";
785: case WSAEINPROGRESS: return "WSAEINPROGRESS";
786: case WSAEALREADY: return "WSAEALREADY";
787: case WSAENOTSOCK: return "WSAENOTSOCK";
788: case WSAEDESTADDRREQ: return "WSAEDESTADDRREQ";
789: case WSAEMSGSIZE: return "WSAEMSGSIZE";
790: case WSAEPROTOTYPE: return "WSAEPROTOTYPE";
791: case WSAENOPROTOOPT: return "WSAENOPROTOOPT";
792: case WSAEPROTONOSUPPORT: return "WSAEPROTONOSUPPORT";
793: case WSAESOCKTNOSUPPORT: return "WSAESOCKTNOSUPPORT";
794: case WSAEOPNOTSUPP: return "WSAEOPNOTSUPP";
795: case WSAEPFNOSUPPORT: return "WSAEPFNOSUPPORT";
796: case WSAEAFNOSUPPORT: return "WSAEAFNOSUPPORT";
797: case WSAEADDRINUSE: return "WSAEADDRINUSE";
798: case WSAEADDRNOTAVAIL: return "WSAEADDRNOTAVAIL";
799: case WSAENETDOWN: return "WSAENETDOWN";
800: case WSAENETUNREACH: return "WSAENETUNREACH";
801: case WSAENETRESET: return "WSAENETRESET";
802: case WSAECONNABORTED: return "WSWSAECONNABORTEDAEINTR";
803: case WSAECONNRESET: return "WSAECONNRESET";
804: case WSAENOBUFS: return "WSAENOBUFS";
805: case WSAEISCONN: return "WSAEISCONN";
806: case WSAENOTCONN: return "WSAENOTCONN";
807: case WSAESHUTDOWN: return "WSAESHUTDOWN";
808: case WSAETOOMANYREFS: return "WSAETOOMANYREFS";
809: case WSAETIMEDOUT: return "WSAETIMEDOUT";
810: case WSAECONNREFUSED: return "WSAECONNREFUSED";
811: case WSAELOOP: return "WSAELOOP";
812: case WSAENAMETOOLONG: return "WSAENAMETOOLONG";
813: case WSAEHOSTDOWN: return "WSAEHOSTDOWN";
814: case WSASYSNOTREADY: return "WSASYSNOTREADY";
815: case WSAVERNOTSUPPORTED: return "WSAVERNOTSUPPORTED";
816: case WSANOTINITIALISED: return "WSANOTINITIALISED";
817: case WSAHOST_NOT_FOUND: return "WSAHOST_NOT_FOUND";
818: case WSATRY_AGAIN: return "WSATRY_AGAIN";
819: case WSANO_RECOVERY: return "WSANO_RECOVERY";
820: case WSANO_DATA: return "WSANO_DATA";
821: default: return "NO ERROR";
822: }
823: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.