Windows.WSock32.Mod 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. MODULE WSock32; (* AUTHOR "ejz, additions Alex Popescu"; PURPOSE " Win32 WSock32 APIs used by Oberon"; *)
  2. IMPORT SYSTEM, Kernel32, Modules, User32,KernelLog;
  3. CONST
  4. MAXGETHOSTSTRUCT* = 1024;
  5. AFINet* = 2; PFINet* = AFINet;
  6. IPProtoIP* = 0;
  7. IPProtoICMP* = 1;
  8. IPProtoIGMP* = 2;
  9. IPProtoTCP* = 6;
  10. IPProtoUDP* = 17;
  11. IPProtoRAW* = 255;
  12. InvalidSocket* = -1;
  13. SocketError* = -1;
  14. SockUndefined* = 0; (*may default to TCP*)
  15. SockStream* = 1; (*for TCP*)
  16. SockDGram* = 2; (*for UDP*)
  17. SockRaw* = 3; (*for low-level; not allowed on newer Windows versions*)
  18. SockRDM* = 4;(* reliable message datagram*)
  19. SockSeqPacket* = 5; (*pseudo stream-packet*)
  20. FDRead* = 01H; FDWrite* = 02H; FDAccept *= 08H; FDConnect* = 010H; FDClose* = 020H;
  21. WSADescriptionLen* = 256; WSASysStatusLen* = 128;
  22. WSABaseErr = 10000;
  23. WSAEInProgress* = WSABaseErr+36; WSAEConnAborted* = WSABaseErr+53;
  24. WSAEConnReset* = WSABaseErr+54; WSAEShutdown* = WSABaseErr+58;
  25. WSAEInval* = WSABaseErr+22; WSAEWouldBlock* = WSABaseErr+35;
  26. WSAENoBufs* = WSABaseErr+55;
  27. WSAEConnRefused*= WSABaseErr+61;
  28. FIONRead* = 4004667FH;
  29. SOLSocket* = 0FFFFH;
  30. SOMaxConn* = 07FFFFFFFH;
  31. SOSndBuf* = 01001H; (** send buffer size *)
  32. SORcvBuf* = 01002H; (** receive buffer size *)
  33. SOSndTimeo* = 01005H; SORcvTimeo* = 01006H;
  34. SIORcvAll* = LONGINT(98000001H);
  35. SDReceive*=0; SDSend*=1; SDboth* = 2; (* graceful shutdown modes *)
  36. MsgPeek* = 2;
  37. TYPE
  38. TimeVal* = POINTER TO TimeValDesc;
  39. TimeValDesc* = RECORD
  40. sec*,musec*: LONGINT; (* seconds and microseconds *)
  41. END;
  42. WSAData* = RECORD
  43. wVersion*, wHighVersion*: INTEGER;
  44. szDescription*: ARRAY WSADescriptionLen+1 OF CHAR;
  45. szSystemStatus*: ARRAY WSASysStatusLen+1 OF CHAR;
  46. iMaxSockets*, iMaxUdpDg*: INTEGER;
  47. lpVendorInfo*: ADDRESS
  48. END;
  49. inAddr* = LONGINT;
  50. PsockaddrIn* = POINTER TO sockaddrIn;
  51. sockaddrIn* = RECORD
  52. sinFamily*, sinPort*: INTEGER;
  53. sinAddr*: inAddr;
  54. inZero: ARRAY 8 OF CHAR
  55. END;
  56. Paddrinfo* = POINTER TO addrinfo;
  57. addrinfo* = RECORD
  58. aiFlags*: SET;
  59. aiFamily*, aiSocktype*, aiProtocol*: LONGINT;
  60. aiAddrlen*: LONGINT;
  61. aiCanonname*: ADDRESS;
  62. aiAddr*{UNTRACED}: PsockaddrIn;
  63. aiNext*{UNTRACED}: Paddrinfo
  64. END;
  65. Socket* = Kernel32.HANDLE;
  66. Group* = LONGINT;
  67. FDSet*=RECORD
  68. fdcount*: LONGINT;
  69. socket*: ARRAY 64 OF Socket (*LONGINT*);
  70. END;
  71. (** The Windows Sockets WSAPROTOCOL_INFO structure is used to store or retrieve complete information for
  72. a given protocol. *)
  73. WSAProtocolInfo* = RECORD
  74. data: ARRAY 372 OF SYSTEM.BYTE
  75. END;
  76. (** The Windows Sockets hostent structure is used by functions to store information about a given host,
  77. such as host name, IP address, and so forth. *)
  78. LPHostent* = ADDRESS;
  79. PHostent*= POINTER {UNTRACED} TO Hostent;
  80. Hostent* = RECORD
  81. hName*:ADDRESS; (* pointer to array of char *)
  82. hAliases*: ADDRESS; (* pointer to array of pointer to array of char *)
  83. hAddrtype*, hLength*: INTEGER;
  84. hAddrList*: ADDRESS;(* pointer to array of pointer of address (with len hLength) *)
  85. END;
  86. Error = OBJECT
  87. VAR
  88. nr: LONGINT;
  89. name: ARRAY 64 OF CHAR;
  90. msg: ARRAY 256 OF CHAR;
  91. left, right: Error;
  92. END Error;
  93. VAR
  94. wsock32: Kernel32.HMODULE;
  95. wship6: Kernel32.HMODULE; (*ALEX POPESCU 2005.11.25*)
  96. wsaStarted: BOOLEAN;
  97. errors: Error;
  98. (** The Windows Sockets WSACleanup function terminates use of the Ws2_32.dll. *)
  99. WSACleanup-: PROCEDURE {WINAPI} (): LONGINT;
  100. (** The Windows Sockets WSAAsyncGetHostByAddr function asynchronously retrieves host information that
  101. corresponds to an address. *)
  102. WSAAsyncGetHostByAddr-: PROCEDURE {WINAPI} (hWnd: User32.HWND; wMsg: LONGINT; VAR addr: ARRAY OF SYSTEM.BYTE; len: LONGINT; type: LONGINT; VAR buf: ARRAY OF SYSTEM.BYTE; buflen: LONGINT): Kernel32.HANDLE;
  103. (** The Windows Sockets WSAAsyncGetHostByName function asynchronously retrieves host information corresponding
  104. to a host name. *)
  105. WSAAsyncGetHostByName-: PROCEDURE {WINAPI} (hWnd: User32.HWND; wMsg: LONGINT; name: ARRAY OF CHAR; VAR buf: ARRAY OF SYSTEM.BYTE; buflen: LONGINT): Kernel32.HANDLE;
  106. (** The Windows Sockets WSAAsyncSelect function requests Windows message-based notification of network events
  107. for a socket. *)
  108. WSAAsyncSelect-: PROCEDURE {WINAPI} (s: Socket; hWnd: User32.HWND; wMsg: LONGINT; lEvent: LONGINT): LONGINT;
  109. (** The Windows Sockets WSAGetLastError function gets the error status for the last operation that failed. *)
  110. WSAGetLastError-: PROCEDURE {WINAPI} (): LONGINT;
  111. (** The Windows Sockets WSASocket function creates a socket that is bound to a specific transport-service provider. *)
  112. WSASocket-: PROCEDURE {WINAPI} (af, type, protocol: LONGINT; VAR lpProtocolInfo: WSAProtocolInfo; g: Group; dwFlags: LONGINT): Socket;
  113. (** The Windows Sockets WSAStartup function initiates use of Ws2_32.dll by a process. *)
  114. WSAStartup-: PROCEDURE {WINAPI} (wVersionRequested: LONGINT; VAR lpWSAData: WSAData): LONGINT;
  115. WSAIoctl-: PROCEDURE {WINAPI} (s: Socket; ioControlCode:LONGINT; VAR in: LONGINT; inSize:LONGINT;
  116. VAR outBuffer:ARRAY OF CHAR; outBufLen: LONGINT; VAR lenReturned:LONGINT; Overlapped: LONGINT; completionRoutine: LONGINT): LONGINT;
  117. (** The Windows Sockets accept function permits an incoming connection attempt on a socket. *)
  118. accept-: PROCEDURE {WINAPI} (s: Socket; VAR addr: ARRAY OF SYSTEM.BYTE; VAR addrlen: LONGINT): Socket;
  119. (** The Windows Sockets bind function associates a local address with a socket. *)
  120. bind-: PROCEDURE {WINAPI} (s: Socket; VAR name: ARRAY OF SYSTEM.BYTE; namelen: LONGINT): LONGINT;
  121. (** The Windows Sockets closesocket function closes an existing socket. *)
  122. closesocket-: PROCEDURE {WINAPI} (s: Socket): LONGINT;
  123. (** The Windows Sockets connect function establishes a connection to a specified socket. *)
  124. connect-: PROCEDURE {WINAPI} (s: Socket; VAR name: ARRAY OF SYSTEM.BYTE; namelen: LONGINT): LONGINT;
  125. freeaddrinfo-:PROCEDURE {WINAPI}(ai:Paddrinfo);
  126. getaddrinfo-: PROCEDURE {WINAPI}(VAR nodename, servname: ARRAY OF CHAR; VAR hints: ARRAY OF SYSTEM.BYTE; VAR res: Paddrinfo): LONGINT;
  127. (** The Windows Sockets gethostbyname function retrieves host information corresponding to a host name from a
  128. host database. *)
  129. gethostbyname-: PROCEDURE {WINAPI} (VAR name: ARRAY OF CHAR): PHostent;
  130. (** The Windows Sockets gethostname function returns the standard host name for the local machine. *)
  131. gethostname-: PROCEDURE {WINAPI} (VAR name: ARRAY OF CHAR; namelen: LONGINT): LONGINT;
  132. (** The Windows Sockets getpeername function retrieves the name of the peer to which a socket is connected. *)
  133. getpeername-: PROCEDURE {WINAPI} (s: Socket; VAR name: ARRAY OF SYSTEM.BYTE; VAR namelen: LONGINT): LONGINT;
  134. (*The getsockname function retrieves the local name for a socket.*)
  135. getsockname-:PROCEDURE {WINAPI} (s: Socket; VAR name: ARRAY OF SYSTEM.BYTE; VAR namelen: LONGINT): LONGINT;
  136. (** The Windows Sockets htonl function converts a u_long from host to TCP/IP network byte order
  137. (which is big-endian). *)
  138. htonl-: PROCEDURE {WINAPI} (x: LONGINT): LONGINT;
  139. (** The Windows Sockets htons function converts a u_short from host to TCP/IP network byte order
  140. (which is big-endian). *)
  141. htons-: PROCEDURE {WINAPI} (x: INTEGER): INTEGER;
  142. (** The Windows Sockets ioctlsocket function controls the I/O mode of a socket. *)
  143. ioctlsocket-: PROCEDURE {WINAPI} (s: Socket; cmd: LONGINT; VAR argp: LONGINT): LONGINT;
  144. (** The Windows Sockets listen function places a socket a state where it is listening for an incoming connection. *)
  145. listen-: PROCEDURE {WINAPI} (s: Socket; backlog: LONGINT): LONGINT;
  146. (** The Windows Sockets ntohl function converts a u_long from TCP/IP network order to host byte order
  147. (which is little-endian on Intel processors). *)
  148. ntohl-: PROCEDURE {WINAPI} (x: LONGINT): LONGINT;
  149. (** The Windows Sockets ntohs function converts a u_short from TCP/IP network byte order to host byte order
  150. (which is little-endian on Intel processors). *)
  151. ntohs-: PROCEDURE {WINAPI} (x: INTEGER): INTEGER;
  152. (** The Windows Sockets recv function receives data from a connected socket. *)
  153. recv-: PROCEDURE {WINAPI} (s: Socket; VAR buf: ARRAY OF SYSTEM.BYTE; len: LONGINT; flags: SET): LONGINT;
  154. (** The Windows Sockets recvfrom function receives a datagram and stores the source address. *)
  155. recvfrom-: PROCEDURE {WINAPI} (s: Socket; VAR buf: ARRAY OF SYSTEM.BYTE; len: LONGINT; flags: LONGINT; VAR from: sockaddrIn (*VAR from: ARRAY OF SYSTEM.BYTE*); VAR fromlen: LONGINT): LONGINT;
  156. (** The select function determines the status of one or more sockets, waiting if necessary, to perform synchronous I/O *)
  157. select-: PROCEDURE {WINAPI} (nfds:INTEGER; VAR readfds,writefds,exceptfds: FDSet; timeout: TimeVal): LONGINT;
  158. (** The Windows Sockets send function sends data on a connected socket. *)
  159. send-: PROCEDURE {WINAPI} (s: Socket; CONST buf: ARRAY OF SYSTEM.BYTE; len: LONGINT; flags: SET): LONGINT;
  160. (** The Windows Sockets sendto function sends data to a specific destination. *)
  161. sendto-: PROCEDURE {WINAPI} (s: Socket; CONST buf: ARRAY OF SYSTEM.BYTE; len: LONGINT; flags: LONGINT; VAR to: ARRAY OF SYSTEM.BYTE; tolen: LONGINT): LONGINT;
  162. (** The Windows Sockets setsockopt function sets a socket option. *)
  163. setsockopt-: PROCEDURE {WINAPI} (s: Socket; level, optname: LONGINT; VAR optval: ARRAY OF SYSTEM.BYTE; optlen: LONGINT): LONGINT;
  164. getsockopt-: PROCEDURE {WINAPI} (s: Socket; level, optname: LONGINT; VAR optval: ARRAY OF SYSTEM.BYTE; VAR optlen: LONGINT): LONGINT;
  165. (** The Windows Sockets socket function creates a socket that is bound to a specific service provider. *)
  166. socket-: PROCEDURE {WINAPI} (af, type, protocol: LONGINT): Socket;
  167. shutdown-:PROCEDURE{WINAPI} (s: Socket; how: LONGINT): LONGINT;
  168. PROCEDURE TermMod;
  169. BEGIN
  170. IF wsock32 # Kernel32.NULL THEN
  171. Kernel32.FreeLibrary(wsock32); wsock32 := Kernel32.NULL
  172. END;
  173. IF wship6 # Kernel32.NULL THEN
  174. Kernel32.FreeLibrary(wship6); wship6 := Kernel32.NULL
  175. END
  176. END TermMod;
  177. PROCEDURE Init;
  178. VAR str: ARRAY 32 OF CHAR;
  179. BEGIN
  180. str := "ws2_32.dll";
  181. wsock32 := Kernel32.LoadLibrary(str);
  182. IF wsock32 = Kernel32.NULL THEN
  183. str := "WSOCK32.DLL";
  184. wsock32 := Kernel32.LoadLibrary(str)
  185. END;
  186. str := "wship6.dll";
  187. wship6 := Kernel32.LoadLibrary(str);
  188. Kernel32.GetProcAddress(wsock32, "WSACleanup", SYSTEM.VAL(ADDRESS, WSACleanup));
  189. Kernel32.GetProcAddress(wsock32, "WSAAsyncGetHostByAddr", SYSTEM.VAL(ADDRESS, WSAAsyncGetHostByAddr));
  190. Kernel32.GetProcAddress(wsock32, "WSAAsyncGetHostByName", SYSTEM.VAL(ADDRESS, WSAAsyncGetHostByName));
  191. Kernel32.GetProcAddress(wsock32, "WSAAsyncSelect", SYSTEM.VAL(ADDRESS, WSAAsyncSelect));
  192. Kernel32.GetProcAddress(wsock32, "WSAGetLastError", SYSTEM.VAL(ADDRESS, WSAGetLastError));
  193. Kernel32.GetProcAddress(wsock32, "WSASocketA", SYSTEM.VAL(ADDRESS, WSASocket));
  194. Kernel32.GetProcAddress(wsock32, "WSAStartup", SYSTEM.VAL(ADDRESS, WSAStartup));
  195. Kernel32.GetProcAddress(wsock32, "WSAIoctl", SYSTEM.VAL(ADDRESS, WSAIoctl));
  196. Kernel32.GetProcAddress(wsock32, "accept", SYSTEM.VAL(ADDRESS, accept));
  197. Kernel32.GetProcAddress(wsock32, "bind", SYSTEM.VAL(ADDRESS, bind));
  198. Kernel32.GetProcAddress(wsock32, "closesocket", SYSTEM.VAL(ADDRESS, closesocket));
  199. Kernel32.GetProcAddress(wsock32, "connect", SYSTEM.VAL(ADDRESS, connect));
  200. Kernel32.GetProcAddress(wsock32, "freeaddrinfo", SYSTEM.VAL(ADDRESS, freeaddrinfo));
  201. Kernel32.GetProcAddress(wsock32, "getaddrinfo", SYSTEM.VAL(ADDRESS, getaddrinfo));
  202. Kernel32.GetProcAddress(wsock32, "gethostbyname", SYSTEM.VAL(ADDRESS, gethostbyname));
  203. Kernel32.GetProcAddress(wsock32, "gethostname", SYSTEM.VAL(ADDRESS, gethostname));
  204. Kernel32.GetProcAddress(wsock32, "getpeername", SYSTEM.VAL(ADDRESS, getpeername));
  205. Kernel32.GetProcAddress(wsock32, "getsockname", SYSTEM.VAL(ADDRESS, getsockname));
  206. Kernel32.GetProcAddress(wsock32, "htonl", SYSTEM.VAL(ADDRESS, htonl));
  207. Kernel32.GetProcAddress(wsock32, "htons", SYSTEM.VAL(ADDRESS, htons));
  208. Kernel32.GetProcAddress(wsock32, "ioctlsocket", SYSTEM.VAL(ADDRESS, ioctlsocket));
  209. Kernel32.GetProcAddress(wsock32, "listen", SYSTEM.VAL(ADDRESS, listen));
  210. Kernel32.GetProcAddress(wsock32, "ntohl", SYSTEM.VAL(ADDRESS, ntohl));
  211. Kernel32.GetProcAddress(wsock32, "ntohs", SYSTEM.VAL(ADDRESS, ntohs));
  212. Kernel32.GetProcAddress(wsock32, "recv", SYSTEM.VAL(ADDRESS, recv));
  213. Kernel32.GetProcAddress(wsock32, "recvfrom", SYSTEM.VAL(ADDRESS, recvfrom));
  214. Kernel32.GetProcAddress(wsock32, "select", SYSTEM.VAL(ADDRESS, select));
  215. Kernel32.GetProcAddress(wsock32, "send", SYSTEM.VAL(ADDRESS, send));
  216. Kernel32.GetProcAddress(wsock32, "sendto", SYSTEM.VAL(ADDRESS, sendto));
  217. Kernel32.GetProcAddress(wsock32, "setsockopt", SYSTEM.VAL(ADDRESS, setsockopt));
  218. Kernel32.GetProcAddress(wsock32, "getsockopt", SYSTEM.VAL(ADDRESS, getsockopt));
  219. Kernel32.GetProcAddress(wsock32, "socket", SYSTEM.VAL(ADDRESS, socket));
  220. Kernel32.GetProcAddress(wsock32, "shutdown", SYSTEM.VAL(ADDRESS, shutdown));
  221. IF freeaddrinfo = NIL THEN
  222. KernelLog.String("Trying to locate getaddrinfo, freeaddrinfo"); KernelLog.Ln;
  223. str := "wship6.dll";
  224. wship6 := Kernel32.LoadLibrary(str);
  225. IF wship6 # Kernel32.NULL THEN
  226. Kernel32.GetProcAddress(wship6, "freeaddrinfo", SYSTEM.VAL(ADDRESS, freeaddrinfo));
  227. Kernel32.GetProcAddress(wship6, "getaddrinfo", SYSTEM.VAL(ADDRESS, getaddrinfo))
  228. ELSE
  229. KernelLog.String("Failed locating getaddrinfo, freeaddrinfo! You must install IPv6!"); KernelLog.Ln;
  230. END
  231. END;
  232. Modules.InstallTermHandler(TermMod)
  233. END Init;
  234. PROCEDURE Startup*;
  235. VAR data: WSAData; res: LONGINT;
  236. BEGIN
  237. KernelLog.String("WSAStartup ");
  238. res := WSAStartup(2, data);
  239. wsaStarted := res = 0;
  240. IF wsaStarted THEN
  241. KernelLog.String("done: "); KernelLog.String(data.szDescription)
  242. ELSE
  243. KernelLog.String("failed: "); KernelLog.Int(res, 0)
  244. END;
  245. KernelLog.Ln()
  246. END Startup;
  247. PROCEDURE CleanUp*;
  248. VAR res: LONGINT;
  249. BEGIN
  250. IF wsaStarted THEN
  251. res := WSACleanup();
  252. wsaStarted := FALSE
  253. END
  254. END CleanUp;
  255. (*** debugging *)
  256. PROCEDURE DispError*;
  257. VAR err: Error; nr: LONGINT;
  258. BEGIN
  259. nr := WSAGetLastError();
  260. IF (nr=0) THEN RETURN END;
  261. err := errors;
  262. WHILE (err # NIL ) & (err.nr # nr) DO
  263. IF nr < err.nr THEN err := err.left
  264. ELSIF nr > err.nr THEN err := err.right
  265. END;
  266. END;
  267. IF err # NIL THEN
  268. KernelLog.Enter; KernelLog.String( "Winsock: (" ); KernelLog.String( err.name ); KernelLog.String( ") : " );
  269. KernelLog.String( err.msg ); KernelLog.Exit;
  270. ELSE
  271. KernelLog.Enter; KernelLog.String( "AosWinsock, unknown Error !! This should never happen:" );
  272. KernelLog.Int( nr, 5 ); KernelLog.Exit;
  273. END;
  274. END DispError;
  275. PROCEDURE Enter( nr: LONGINT; short, desc: ARRAY OF CHAR );
  276. VAR this: Error;
  277. PROCEDURE InsertErr( VAR err: Error; this: Error );
  278. BEGIN
  279. IF err # NIL THEN
  280. IF this.nr < err.nr THEN InsertErr( err.left, this ) ELSE InsertErr( err.right, this ) END;
  281. ELSE err := this;
  282. END;
  283. END InsertErr;
  284. BEGIN
  285. NEW( this ); this.nr := nr; COPY( short, this.name ); COPY( desc, this.msg ); InsertErr( errors, this );
  286. END Enter;
  287. PROCEDURE InitErrs;
  288. BEGIN
  289. Enter( 10013, "WSAEACCES", "Permission denied." );
  290. Enter( 10048, "WSAEADDRINUSE", "Address already in use." );
  291. Enter( 10049, "WSAEADDRNOTAVAIL", "Cannot assign requested address." );
  292. Enter( 10047, "WSAEAFNOSUPPORT", "Address family not supported by protocol family." );
  293. Enter( 10037, "WSAEALREADY", "Operation already in progress." );
  294. Enter( 10061, "WSAECONNREFUSED", "Connection refused." );
  295. Enter( 10053, "WSAECONNABORTED", "Software caused connection abort." );
  296. Enter( 10054, "WSAECONNRESET", "Connection reset by peer." );
  297. Enter( 10039, "WSAEDESTADDRREQ", "Destination address required." );
  298. Enter( 10014, "WSAEFAULT", "Bad address." ); Enter( 10064, "WSAEHOSTDOWN", "Host is down." );
  299. Enter( 10065, "WSAEHOSTUNREACH", "No route to host." );
  300. Enter( 10036, "WSAEINPROGRESS", "Operation now in progress. " );
  301. Enter( 10004, "WSAEINTR", "Interrupted function call." ); Enter( 10022, "WSAEINVAL", "Invalid argument." );
  302. Enter( 10056, "WSAEISCONN", "Socket is already connected." );
  303. Enter( 10024, "WSAEMFILE", "Too many open files." ); Enter( 10040, "WSAEMSGSIZE", "Message too long." );
  304. Enter( 10050, "WSAENETDOWN", "Network is down." );
  305. Enter( 10052, "WSAENETRESET", "Network dropped connection on reset." );
  306. Enter( 10051, "WSAENETUNREACH", "Network is unreachable." );
  307. Enter( 10055, "WSAENOBUFS", "No buffer space available." );
  308. Enter( 10042, "WSAENOPROTOOPT", "Bad protocol option." );
  309. Enter( 10057, "WSAENOTCONN", "Socket is not connected." );
  310. Enter( 10038, "WSAENOTSOCK", "Socket operation on non-socket." );
  311. Enter( 10045, "WSAEOPNOTSUPP", "Operation not supported." );
  312. Enter( 10046, "WSAEPFNOSUPPORT", "Protocol family not supported." );
  313. Enter( 10067, "WSAEPROCLIM", "Too many processes." );
  314. Enter( 10043, "WSAEPROTONOSUPPORT", "Protocol not supported." );
  315. Enter( 10041, "WSAEPROTOTYPE", "Protocol wrong type for socket." );
  316. Enter( 10058, "WSAESHUTDOWN", "Cannot send after socket shutdown." );
  317. Enter( 10044, "WSAESOCKTNOSUPPORT", "Socket type not supported." );
  318. Enter( 10060, "WSAETIMEDOUT", "Connection timed out." );
  319. Enter( 10109, "WSATYPE_NOT_FOUND", "Class type not found" );
  320. Enter( 10035, "WSAEWOULDBLOCK", "Resource temporarily unavailable." );
  321. Enter( 11001, "WSAHOST_NOT_FOUND", "Host not found." );
  322. Enter( 10093, "WSANOTINITIALISED", "Successful WSAStartup() not yet performed." );
  323. Enter( 11004, "WSANO_DATA", "Valid name, no data record of requested type." );
  324. Enter( 11003, "WSANO_RECOVERY", "This is a non-recoverable error." );
  325. Enter( 10091, "WSASYSNOTREADY", "Network subsystem is unavailable." );
  326. Enter( 11002, "WSATRY_AGAIN", "Non-authoritative host not found." );
  327. Enter( 10092, "WSAVERNOTSUPPORTED", "WINSOCK.DLL version out of range." );
  328. Enter( 10101, "WSAEDISCON", "Graceful shutdown in progress." );
  329. END InitErrs;
  330. BEGIN
  331. InitErrs(); Init();
  332. END WSock32.
  333. SystemTools.FreeDownTo WSock32~