WINSOCK.C
上传用户:qiye66666
上传日期:2007-01-03
资源大小:202k
文件大小:11k
源码类别:

TCP/IP协议栈

开发平台:

Visual C++

  1. /*
  2.  * Copyright (C) 1993 by ISA Corp.  All Rights Reserved.
  3.  *
  4.  * $Header: $
  5.  *
  6.  * Name:        Windows Socket API for Wat-TCP 1.0
  7.  * Author:
  8.  * Date:        1993
  9.  *
  10.  * Description:
  11.  *
  12.  * This DLL implements the Windows Socket API version 1.1 for the
  13.  * Waterloo TCP stack ver 1.0.
  14.  *
  15.  * Refer to the Windows Sockets Version 1.1 DRAFT 2 specification
  16.  * for a complete description how to use the API.
  17.  * 
  18.  *
  19.  *************************************************************************
  20.  *                                                                       *
  21.  *   THE DLL IS NOT WINSOCK COMPLIANT AS ONLY THOSE ROUTINES NEEDED      *
  22.  *   TO IMPLEMENT THE CLIENT (PC) SIDE OF THE INTERFACE ARE SUPPORTED.   *
  23.  *                                                                       *
  24.  *************************************************************************
  25.  *
  26.  *
  27.  */
  28. #include <stdio.h>
  29. #include <string.h>
  30. #include "winsock.h"
  31. static char     *version = "Wat-TCP version 1.0 Socket API";
  32. static int      init = 0;
  33. static int      lasterror = 0 ;
  34. #define WSA_VERSION(major,minor) ((major) + 256*(minor))
  35. extern int PASCAL FAR wattcp_init(void);
  36. extern void sock_init();
  37. extern int PASCAL FAR wat_socket(int domain, int tpye, int protocol);
  38. extern int PASCAL FAR wat_connect(SOCKET s, struct sockaddr FAR *name, int namelen);
  39. extern int PASCAL FAR wat_closesocket(SOCKET s);
  40. extern int PASCAL FAR wat_select(int nfds, fd_set FAR *readfds,
  41.     fd_set FAR *writefds, fd_set FAR *exceptfds, struct timeval FAR *timeout);
  42. extern int PASCAL FAR wat_receive(SOCKET s, char FAR *buf, int len, int flags);
  43. extern int PASCAL FAR wat_send(SOCKET s, char FAR *buf, int len, int flags);
  44. extern struct hostent FAR * PASCAL FAR wat_gethostbyname(char FAR *name);
  45. extern unsigned long PASCAL FAR wat_inet_addr(char FAR *cp);
  46. extern u_long PASCAL FAR wat_htonl(u_long hostlong);
  47. extern u_long PASCAL FAR wat_ntohl(u_long netlong);
  48. extern u_short PASCAL FAR wat_htons(u_short hostshort);
  49. extern u_short PASCAL FAR wat_ntohs(u_short netshort);
  50. extern int PASCAL FAR wat_WSACleanup(void);
  51. /* --- DLL initialization --- */
  52. int PASCAL FAR LibMain(HANDLE hInstance, WORD wDataSeg, WORD wHeapSize, LPSTR lpCmdLine)
  53. {
  54.     return(1);
  55. } /* LibMain */
  56. void PASCAL FAR WEP(int nParameter)
  57. {
  58. } /* WEP */
  59. int PASCAL FAR WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData)
  60. {
  61.     int major = LOBYTE(wVersionRequired);
  62.     int minor = HIBYTE(wVersionRequired);
  63.     
  64. /* verify stack is loaded and WSA version is correct */
  65.       if (wattcp_init() == 0 )   
  66.   return(WSASYSNOTREADY);         /* PC-NFS inittialize fails */
  67.       
  68.       if ( (major > 2) || ((major == 2) && (minor > 0)) ) 
  69.   return(WSAVERNOTSUPPORTED);     /* version not supported */
  70.     
  71.     /* return WSA status */
  72.     lpWSAData->wVersion = WSA_VERSION(1,1);
  73.     lpWSAData->wHighVersion = WSA_VERSION(1,1);
  74.     memcpy(lpWSAData->szDescription, version, strlen(version)+1);
  75.     lpWSAData->szSystemStatus[0] = '';
  76.     lpWSAData->iMaxSockets = 8;
  77.     lpWSAData->iMaxUdpDg = 0;
  78.     lpWSAData->lpVendorInfo = (char FAR *) 0;
  79.     init = 1;                             /* must be set according to spec */
  80.     return(0);
  81. } /* WSAStartup */
  82. /* --- Windows Socket API --- */
  83. /* socket - create a socket */
  84. SOCKET PASCAL FAR socket(int domain, int type, int protocol)
  85. {   
  86.     if ( init == 0 ) {
  87.  lasterror = WSANOTINITIALISED;
  88.  return(INVALID_SOCKET) ;
  89.     }
  90.     lasterror = wat_socket(domain, type, protocol);
  91.     if( lasterror > WSABASEERR )
  92.  return(INVALID_SOCKET);
  93.     return(lasterror) ;
  94. } /* socket */
  95. /* connect - establish a connection to a peer */
  96. int PASCAL FAR connect(SOCKET s, struct sockaddr FAR *name, int namelen)
  97. {
  98.     if ( init == 0 ) {
  99.  lasterror = WSANOTINITIALISED;
  100.  return(SOCKET_ERROR) ;
  101.     }
  102.     lasterror = wat_connect(s, name, namelen) ;
  103.     if( lasterror > WSABASEERR )
  104.  return(SOCKET_ERROR);
  105.     return(lasterror) ;
  106. } /* connect */
  107. /* closesocket - close a socket */
  108. int PASCAL FAR closesocket(SOCKET s)
  109. {
  110.    if ( init == 0 ) {
  111. lasterror = WSANOTINITIALISED;
  112. return(SOCKET_ERROR) ;
  113.    }
  114.    lasterror =  wat_closesocket(s) ;
  115.    if (lasterror > WSABASEERR)
  116. return(SOCKET_ERROR);
  117.    return(lasterror);
  118. } /* closesocket */
  119. /* select - determine the status of one of more sockets */
  120. int PASCAL FAR select(int nfds, fd_set FAR *readfds, fd_set FAR *writefds, fd_set FAR *exceptfds, struct timeval FAR *timeout)
  121. {
  122.    if ( init == 0 ) {
  123. lasterror = WSANOTINITIALISED;
  124. return(SOCKET_ERROR) ;
  125.    }
  126.    lasterror = wat_select(nfds, readfds, writefds, exceptfds, timeout) ;
  127.    if( lasterror > WSABASEERR)
  128. return(SOCKET_ERROR) ;
  129.    return(lasterror);
  130. } /* select */
  131. /* recv - receive data from a socket */
  132. int PASCAL FAR recv(SOCKET s, char FAR *buf, int len, int flags)
  133. {
  134.    if ( init == 0 ) {
  135. lasterror = WSANOTINITIALISED;
  136. return(SOCKET_ERROR) ;
  137.    }
  138.    lasterror = wat_receive(s, buf, len, flags) ;
  139.    if(lasterror > WSABASEERR)
  140. return(SOCKET_ERROR) ;
  141.    return(lasterror);
  142. } /* recv */
  143. /* send - send data on a connected socket */
  144. int PASCAL FAR send(SOCKET s, char FAR *buf, int len, int flags)
  145. {
  146.    if ( init == 0 ) {
  147. lasterror = WSANOTINITIALISED;
  148. return(SOCKET_ERROR) ;
  149.    }
  150.    lasterror = wat_send(s, buf, len, flags) ;
  151.    if(lasterror > WSABASEERR)
  152. return(SOCKET_ERROR) ;
  153.    return(lasterror);
  154. } /* send */
  155. /* gethostbyname - get host information corresponding to a hostname */
  156. struct hostent FAR * PASCAL FAR gethostbyname(char FAR *name)
  157. {
  158.    if ( init == 0 ) {
  159. lasterror = WSANOTINITIALISED;
  160. return(NULL) ;
  161.    }
  162.    return( wat_gethostbyname(name)) ;
  163. } /* gethostbyname */
  164. /* inet_addr - convert a string containin a dotted address */
  165. unsigned long PASCAL FAR inet_addr(char FAR *cp)
  166. {
  167.    unsigned long address ;
  168.    if( !(address = wat_inet_addr(cp)) )
  169. return ( INADDR_NONE );
  170.     return ( address ) ;
  171. } /* inet_addr */
  172. /* host to network byte order */
  173. u_long PASCAL FAR htonl(u_long hostlong)
  174. {
  175.     return(wat_htonl(hostlong));
  176. } /* htonl */
  177. u_short PASCAL FAR htons(u_short hostshort)
  178. {
  179.     return(wat_htons(hostshort));
  180. } /* htons */
  181. /* network to host byte order */
  182. u_long PASCAL FAR ntohl(u_long netlong)
  183. {
  184.     return(wat_ntohl(netlong));
  185. } /* ntohl */
  186. u_short PASCAL FAR ntohs(u_short netshort)
  187. {
  188.     return(wat_ntohs(netshort));
  189. } /* ntohs */
  190. /* FD_ISSET supporting function; not for use by applications */
  191. int PASCAL FAR __WSAFDIsSet(SOCKET fd, fd_set FAR *set)
  192. {
  193.     int i;
  194.     if (set == (fd_set FAR *) 0)
  195. return(0);
  196.     i = set->fd_count;
  197.     while (i--)
  198. if (set->fd_array[i] == fd)
  199.     return(1);
  200.     return(0);
  201. } /* __WSAFDIsSet */
  202. int PASCAL FAR WSAGetLastError(void)
  203. {
  204.    return(lasterror) ;
  205. }
  206. /* --- %%% Unsupported Routines --- */
  207. SOCKET PASCAL FAR accept(SOCKET s, struct sockaddr FAR *addr, int FAR *addrlen)
  208. {
  209.     return(INVALID_SOCKET);
  210. } /* accept */
  211. int PASCAL FAR bind(SOCKET s, struct sockaddr FAR *name, int namelen)
  212. {
  213.     return(SOCKET_ERROR);
  214. } /* bind */
  215. int PASCAL FAR getpeername(SOCKET s, struct sockaddr FAR *name, int FAR *namelen)
  216. {
  217.     return(SOCKET_ERROR);
  218. } /* getpeername */
  219. int PASCAL FAR getsockname(SOCKET s, struct sockaddr FAR *name, int FAR *namelen)
  220. {
  221.     return(SOCKET_ERROR);
  222. } /* getsockname */
  223. int PASCAL FAR getsockopt(SOCKET s, int level, int optname, char FAR *optval, int FAR *optlen)
  224. {
  225.     return(SOCKET_ERROR);
  226. } /* getsockopt */
  227. int PASCAL FAR ioctlsocket(SOCKET s, long cmd, u_long FAR *argp)
  228. {
  229.     return(SOCKET_ERROR);
  230. } /* ioctlsocket */
  231. char FAR * PASCAL FAR inet_ntoa(struct in_addr in)
  232. {
  233.     return((char FAR *) 0);
  234. } /* inet_ntoa */
  235. int PASCAL FAR listen(SOCKET s, int backlog)
  236. {
  237.     return(SOCKET_ERROR);
  238. } /* listen */
  239. int PASCAL FAR recvfrom(SOCKET s, char FAR *buf, int len, int flags, struct sockaddr FAR *from, int FAR *fromlen)
  240. {
  241.     return(SOCKET_ERROR);
  242. } /* recvfrom */
  243. int PASCAL FAR sendto(SOCKET s, char FAR *buf, int len, int flags, struct sockaddr FAR *to, int tolen)
  244. {
  245.     return(SOCKET_ERROR);
  246. } /* sendto */
  247. int PASCAL FAR setsockopt(SOCKET s, int level, int optname, char FAR *optval, int optlen)
  248. {
  249.     return(SOCKET_ERROR);
  250. } /* setsockopt */
  251. int PASCAL FAR shutdown(SOCKET s, int how)
  252. {
  253.     return(SOCKET_ERROR);  
  254. } /* shutdown */;
  255. struct hostent FAR * PASCAL FAR gethostbyaddr(char FAR *addr, int len, int type)
  256. {
  257.     return((struct hostent FAR *) 0);
  258. } /* gethostbyaddr */
  259. int PASCAL FAR gethostname(char FAR *name, int namelen)
  260. {
  261.     return(SOCKET_ERROR);
  262. } /* gethostname */
  263. struct protoent FAR * PASCAL FAR getprotobyname(char FAR *name)
  264. {
  265.     return((struct protoent FAR *) 0);
  266. } /* getprotobyname */
  267. struct protoent FAR * PASCAL FAR getprotobynumber(int number)
  268. {
  269.     return((struct protoent FAR *) 0);
  270. } /* getprotobynumber */
  271. struct servent FAR * PASCAL FAR getservbyname(char FAR *name, char FAR *proto)
  272. {
  273.     return((struct servent FAR *) 0);
  274. } /* getservbyname */
  275. struct servent FAR * PASCAL FAR getservbyport(int port, char FAR *proto)
  276. {
  277.     return((struct servent FAR *) 0);
  278. } /* getservbyport */
  279. HANDLE PASCAL FAR WSAAsyncGetHostByAddr(HWND hWnd, unsigned int wMsg, char FAR *addr, int len, int type, char FAR *buf, int buflen)
  280. {
  281.     return(0);
  282. } /* WSAAsyncGetHostByAddr */
  283. HANDLE PASCAL FAR WSAAsyncGetHostByName(HWND hWnd, unsigned int wMsg, char FAR *name, char FAR *buf, int buflen)
  284. {
  285.     return(0);
  286. } /* WSAAsyncGetHostByName */
  287. HANDLE PASCAL FAR WSAAsyncGetProtoByName(HWND hWnd, unsigned int wMsg, char FAR *name, char FAR *buf, int buflen)
  288. {
  289.     return(0);
  290. } /* WSAAsyncGetProtoByName */
  291. HANDLE PASCAL FAR WSAAsyncGetProtoByNumber(HWND hWnd, unsigned int wMsg, int number, char FAR *buf, int buflen)
  292. {
  293.     return(0);
  294. } /* WSAAsyncGetProtoByNumber */
  295. HANDLE PASCAL FAR WSAAsyncGetServByName(HWND hWnd, unsigned int wMsg, char FAR *name, char FAR *proto, char FAR *buf, int buflen)
  296. {
  297.     return(0);
  298. } /* WSAAsyncGetServByName */
  299. HANDLE PASCAL FAR WSAAsyncGetServByPort(HWND hWnd, unsigned int wMsg, int port, char FAR *proto, char FAR *buf, int buflen)
  300. {
  301.     return(0);
  302. } /* WSAAsyncGetServByPort */
  303. int PASCAL FAR WSAAsyncSelect(SOCKET s, HWND hWnd, unsigned int wMsg, long lEvent)
  304. {
  305.     return(SOCKET_ERROR);
  306. } /* WSAAsyncSelect */
  307. int PASCAL FAR WSACancelAsyncRequest(HANDLE hAsyncTaskHandle)
  308. {
  309.     return(SOCKET_ERROR);
  310. } /* WSACancelAsyncRequest */
  311. int PASCAL FAR WSACancelBlockingCall(void)
  312. {
  313.     return(SOCKET_ERROR);
  314. } /* WSACancelBlockingCall */
  315. int PASCAL FAR WSACleanup(void)
  316. {
  317.     init = 0 ;
  318.     return(wat_WSACleanup()) ;
  319. /*    return(SOCKET_ERROR);  */
  320. } /* WSACleanup */
  321. BOOL PASCAL FAR WSAIsBlocking(void)
  322. {
  323.     return(FALSE);
  324. } /* WSAIsBlocking */
  325. FARPROC PASCAL FAR WSASetBlockingHook(FARPROC lpBlockFunc)
  326. {
  327.     return((FARPROC) 0);
  328. } /* WSASetBlockingHook */
  329. void PASCAL FAR WSASetLastError(int iError)
  330. {
  331.   iError = iError ;
  332. } /* WSASetLastError */
  333. int PASCAL FAR WSAUnhookBlockingHook(void)
  334. {
  335.     return(SOCKET_ERROR);
  336. } /* WSAUnhookBlockingHook */