字体: | 推荐给好友 上一篇 | 下一篇

Windows Sockets 规范及应用

发布: 2008-4-30 22:53 | 作者: 施炜 李铮 秦颍 | 来源: 网络转载 | 查看: 397次

 

7.19 WSARecvFrom()

简述:接收一个数据报并保存源地址。
 
          #include <winsock2.h>1
 
          int WSAAPI WSARecvFrom ( SOCKET s, LPWSABUF
          lpBuffers, DWORD dwBufferCount, LPDWORD
          lpNumberOfBytesRecvd, LPINT lpFlags, LPVOID
          lpFrom, LPINT lpFromlen, LPWSAOVERLAPPED
          lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE
          lpCompletionRoutine );
 
s:一个标识套接口的描述字。
lpBuffers:一个指向WSABUF结构数组的指针。每个WSABUF结构包含缓冲区的指针和缓冲区的大小。
dwBufferCount:lpBuffers数组中WSABUF结构的数目。
lpNumberOfBytesRecvd:如果接收操作立即完成,则为一个指向所接收数据字节数的指针。
lpFlags:一个指向标志位的指针。
lpFrom:(可选)指针,指向重叠操作完成后存放源地址的缓冲区。
lpFromlen:指向from缓冲区大小的指针,仅当指定了lpFrom才需要。
lpOverlapped:指向WSAOVERLAPPED结构的指针(对于非重叠套接口则忽略)。
lpCompletionRoutine:一个指向接收操作完成后调用的完成例程的指针。(对于非重叠套接口则忽略)。
 
返回值:
  若无错误发生且接收操作立即完成,则WSARecvFrom()函数返回所接收的字节数。如果连接结束,则返回0。请注意在这种情况下完成指示(启动指定的完成例程或设置一个事件对象)将早已发生。否则的话,将返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()来获取相应的错误代码。错误代码WSA_IO_PENDING表示重叠操作成功启动,过后将有完成指示。任何其他的错误表示重叠操作未能成功地启动,以后也不会有完成指示。
  如果设置了MSG_INTERRUPT标志,则返回值的含义变化。零表示成功,具体含义同上。否则的话,返回值直接包含如下所示的错误代码。由于中断环境中无法调用WSAGetLastError(),故是必需的。请注意仅适用于Win16环境,仅适用于PROTOCOL_INFO结构中设置了XP1_INTERRUPT位的协议。
 
错误代码:
WSANOTINITIALISED              在调用本API之前应成功调用WSAStartup()。
WSAENETDOWN               网络子系统失效。
WSAEFAULT                      lpFromlen参数非法;lpFrom缓冲区太小,无法容纳远端地址。
WSAEINTR                        通过WSACancelBlockingCall()函数取消(阻塞)调用。
WSAEINPROGRESS           一个阻塞的WinSock调用正在进行中,或者服务提供者仍在处理一个回调函数。(参见B.3.6.6节)
WSAEINVAL                      套接口未用bind()捆绑,或者套接口未用重叠标志创建。
WSAENETRESET               由于远端的复位造成连接的中止。
WSAENOTCONN                套接口未连接。(仅适用于面向连接的套接口)。
WSAENOTSOCK                描述字不是一个套接口。
WSAEOPNOTSUPP             设置了MSG_OOB,但是该套接口不是诸如SOCK_STREAM流类型的,与套接口相关的通讯域不支持带外数据,或者套接口是单向的,只支持发送操作。
WSAESHUTDOWN             套接口已经关闭;一个套接口以SD_RECEIVE或                              SD_BOTH的how参数shutdown()后,无法进行WSARecvFrom()调用。
WSAEWOULDBLOCK         重叠套接口:太多重叠的输入/输出请求。非重叠套接口:套接口被标志为非阻塞,但是操作不能立即完成。
WSAEMSGSIZE                  消息太大无法全部装入指定的缓冲区,故被修剪。
WSAECONNABORTED       由于超时或其他错误导致虚电路中止。
WSAECONNRESET            虚电路被远端复位。
WSAEDISCON                    远端优雅地中止了连接。
WSA_IO_PENDING            成功启动一个重叠操作,过后将有完成指示。
 
另请参阅:  WSACloseEvent(),WSACreateEvent(),WSAGetOverlappedResult(), WSASocket(),WSAWaitForMultipleEvents()
 

7.20 WSAResetEvent()

简述:将指定的事件对象状态清除为未置信号。
 
          #include <winsock2.h>
 
          BOOL WSAAPI WSAResetEvent( WSAEVENT hEvent );
 
hEvent:标识一个开放的事件对象句柄。
 
返回值:
  如果函数成功,返回真TRUE。如果函数失败,返回假FALSE。可调用WSAGetLastError()来获取进一步的错误信息。
 
错误代码:
WSA_INVALID_HANDLE    hEvent不是一个合法的事件对象句柄。
 
另请参阅:  WSACreateEvent(), WSASetEvent(), WSACloseEvent().
   

7.21 WSASend()

简述:在一个已连接的套接口上发送数据。
 
          #include <winsock2.h>
 
          int WSAAPI WSASend ( SOCKET s, LPWSABUF lpBuffers,
          DWORD dwBufferCount, LPDWORD lpNumberOfBytesSent,
          int iFlags, LPWSAOVERLAPPED lpOverlapped,
          LPWSAOVERLAPPED_COMPLETION_ROUTINE
          lpCompletionRoutine );
 
s:标识一个已连接套接口的描述字。
lpBuffers:一个指向WSABUF结构数组的指针。每个WSABUF结构包含缓冲区的指针和缓冲区的大小。
dwBufferCount:lpBuffers数组中WSABUF结构的数目。
lpNumberOfBytesSent:如果发送操作立即完成,则为一个指向所发送数据字节数的指针。
iFlags:标志位。
lpOverlapped:指向WSAOVERLAPPED结构的指针(对于非重叠套接口则忽略)。
lpCompletionRoutine:一个指向发送操作完成后调用的完成例程的指针。(对于非重叠套接口则忽略)。
 
返回值:
  若无错误发生且发送操作立即完成,则WSASend()函数返回所发送的字节数。(注意该数目可能小于len参数所指定的值)。如果连接结束,则返回0。请注意在这种情况下完成指示(启动指定的完成例程或设置一个事件对象)将早已发生。否则的话,将返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()来获取相应的错误代码。错误代码WSA_IO_PENDING表示重叠操作成功启动,过后将有完成指示。任何其他的错误表示重叠操作未能成功地启动,以后也不会有完成指示。
  如果设置了MSG_INTERRUPT标志,则返回值的含义变化。零表示成功,具体含义同上。否则的话,返回值直接包含如下所示的错误代码。由于中断环境中无法调用WSAGetLastError(),故是必需的。请注意仅适用于Win16环境,仅适用于PROTOCOL_INFO结构中设置了XP1_INTERRUPT位的协议。
 
错误代码:
WSANOTINITIALISED              在调用本API之前应成功调用WSAStartup()。
WSAENETDOWN               网络子系统失效。
WSAEACCES                      请求地址为广播地址,但相应标志位没有设置。
WSAEINTR                        通过WSACancelBlockingCall()函数取消(阻塞)调用。
WSAEINPROGRESS           一个阻塞的WinSock调用正在进行中,或者服务提供者仍在处理一个回调函数。(参见B.3.6.6节)
WSAEFAULT                      lpBuffer参数并不是用户地址空间的一个有效部分。
WSAENETRESET               由于远端复位造成连接的中止。
WSAENOBUFS                   WinSock提供者报告一个缓冲区死锁。
WSAENOTCONN                套接口未连接。
WSAENOTSOCK                描述字不是一个套接口。
WSAEOPNOTSUPP             设置了MSG_OOB,但是该套接口不是诸如SOCK_STREAM流类型的,与套接口相关的通讯域不支持带外数据,或者套接口是单向的,只支持接收操作。
WSAESHUTDOWN             套接口已经关闭;一个套接口以SD_SEND或SD _BOTH的how参数shutdown()后,无法进行WSASend()调用。
WSAEWOULDBLOCK         太多的重叠输入/输出操作。
WSAEMSGSIZE                  套接口是面向消息的,但是消息大于底层传送的最大值。
WSAEINVAL                      套接口未用bind()捆绑,或者套接口未用重叠标志位创建。
WSAECONNABORTED       由于超时或其他错误导致虚电路中止。
WSAECONNRESET            虚电路被远端复位。
WSA_IO_PENDING            成功启动重叠操作,过后将有完成指示。
 
另请参阅:  WSACloseEvent(),WSACreateEvent(),WSAGetOverlappedResult(), WSASocket(),WSAWaitForMultipleEvents()
   

7.22 WSASendDisconnect()

简述:启动套接口连接的中止操作。
 
          #include <winsock2.h>
 
          int WSAAPI WSASendDisconnect ( SOCKET s, LPWSABUF
          lpOutboundDisconnectData );
 
s:一个标识套接口的描述字。
lpOutboundDisconnectData:指向发出的中止连接数据的指针。
 
返回值:若无错误发生,WSASendDisconnect()返回0。否则的话,将返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()来获取相应的错误代码。
 
错误代码:
WSANOTINITIALISED              在调用本API之前应成功调用WSAStartup()。
WSAENETDOWN              网络子系统失效。
WSAENOPROTOOPT         lpOutboundDisconnectData参数非NULL,复位提供者不支持中止连接数据。
WSAEINPROGRESS           一个阻塞的WinSock调用正在进行中,或者服务提供者仍在处理一个回调函数。(参见B.3.6.6节)
WSAENOTCONN                套接口未连接(仅适用于面向连接的套接口)。
WSAENOTSOCK                描述字不是一个套接口。
 
另请参阅:  connect(), socket().
   

7.23 WSASendTo()

简述:向指定地址发送数据,可能的话使用重叠输入/输出操作。
 
          #include <winsock2.h>
 
          int WSAAPI WSASendTo ( SOCKET s, LPWSABUF
          lpBuffers, DWORD dwBufferCount, LPDWORD
          lpNumberOfBytesSent, int iFlags, LPVOID lpTo, int
          iToLen, LPWSAOVERLAPPED lpOverlapped,
          LPWSAOVERLAPPED_COMPLETION_ROUTINE
          lpCompletionRoutine );
 
         
s:用于标识一个已连接的套接口,该套接口以WSA_FLAG_OVERLAPPED标志调用WSASocket()创建。
lpBuffers:一个指向WSABUF结构数组的指针。每个WSABUF结构包含缓冲区的指针和缓冲区的大小。
dwBufferCount:lpBuffers数组中WSABUF结构的数目。
lpNumberOfBytesSent:如果发送操作立即完成,则为一个指向所发送数据字节数的指针。
iFlags:标志位。
lpTo:(可选)指针,指向目标套接口的地址。
lpTolen:lpTo中地址的大小。
lpOverlapped:指向WSAOVERLAPPED结构的指针(对于非重叠套接口则忽略)。
lpCompletionRoutine:一个指向发送操作完成后调用的完成例程的指针。(对于非重叠套接口则忽略)。
 
返回值:
  若无错误发生且发送操作立即完成,则WSASendTo()函数返回所发送的字节数(请注意它可能小于len所指定的值)。请注意在这种情况下完成指示(启动指定的完成例程或设置一个事件对象)将早已发生。否则的话,将返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()来获取相应的错误代码。错误代码WSA_IO_PENDING表示重叠操作成功启动,过后将有完成指示。任何其他的错误表示重叠操作未能成功地启动,以后也不会有完成指示。
  如果设置了MSG_INTERRUPT标志,则返回值的含义变化。零表示成功,具体含义同上。否则的话,返回值直接包含如下所示的错误代码。由于中断环境中无法调用WSAGetLastError(),故是必需的。请注意仅适用于Win16环境,仅适用于PROTOCOL_INFO结构中设置了XP1_INTERRUPT位的协议。
 
错误代码:
WSANOTINITIALISED              在调用本API之前应成功调用WSAStartup()。
WSAENETDOWN               网络子系统失效。
WSAEACCES                      请求的地址为广播地址,但未设置相应的标志位。
WSAEINTR                        通过WSACancelBlockingCall()函数取消(阻塞)调用。
WSAEINPROGRESS           一个阻塞的WinSock调用正在进行中,或者服务提供者仍在处理一个回调函数。(参见B.3.6.6节)
WSAEFAULT                      lpBuffer或lpTo参数不是用户地址空间的一部分;或者lpTo参数太小(小于sockaddr结构的大小)。
WSAENETRESET               远端主机复位造成连接的中止。
WSAENOBUFS                   WinSock提供者报告了一个缓冲区死锁。
WSAENOTCONN                套接口未连接(仅适用于面向连接的套接口)。
WSAENOTSOCK                描述字不是一个套接口。
WSAEOPNOTSUPP             设置了MSG_OOB,但是该套接口不是诸如SOCK_STREAM流类型的,与套接口相关的通讯域不支持带外数据,或者套接口是单向的,只支持接收操作。
WSAESHUTDOWN             套接口已经关闭;一个套接口以SD_SEND或SD _BOTH的how参数shutdown()后,无法进行WSASendTo()调用。
WSAEWOULDBLOCK         太多重叠的输入/输出请求。
WSAEMSGSIZE                  套接口是面向消息的,且消息大于底层传送所支持的最大长度。
WSAEINVAL                      套接口未用bind()捆绑,或者套接口未用重叠标志位创建。
WSAECONNABORTED       由于超时或其他错误导致虚电路中止。
WSAECONNRESET            虚电路被远端复位。
WSAEADDRNOTAVAIL      本地主机无法获取所指定的地址。
WSAEAFNOSUPPORT        指定地址族中的地址无法与本套接口一起使用。
WSAEDESTADDRREQ 需要目的地地址。
WSAENETUNREACH          当前无法从本主机联系网络。
WSA_IO_PENDING            成功启动一个重叠操作,过后将有完成指示。
 
另请参阅:  WSACloseEvent(),WSACreateEvent(),WSAGetOverlappedResult(), WSASocket(),WSAWaitForMultipleEvents()
   

7.24 WSASetEvent()

简述:将指定的事件对象状态设置为有信号。
 
          #include <winsock2.h>
 
          BOOL WSAAPI WSASetEvent( WSAEVENT hEvent );
 
hEvent:标识一个开放的事件对象句柄。
 
返回值:
  如果函数成功,返回真TRUE。
  如果函数失败,返回假FALSE。可通过调用WSAGetLastError()来获取进一步的错误信息。
 
错误代码:
WSANOTINITIALISED              在调用本API之前应成功调用WSAStartup()。
WSAENETDOWN               网络子系统失效。
WSA_INVALID_HANDLE    hEvent不是一个合法的事件对象句柄。
 
另请参阅:  WSACreateEvent(), WSAResetEvent(),WSACloseEvent().
   

7.25 WSASocket()

简述:创建一个与指定传送服务提供者捆绑的套接口,可选地创建和/或加入一个套接口组。
 
          #include <winsock2.h>
 
          SOCKET WSAAPI WSASocket ( int af, int type, int
          protocol, LPPROTOCOL_INFO lpProtocolInfo, Group g,
          int iFlags);
 
         
af:地址族描述。目前仅支持PF_INET格式,亦即ARPA Internet地址格式。
type:新套接口的类型描述。
protocol:套接口使用的特定协议,如果调用者不愿指定协议则定为0。
lpProtocolInfo:一个指向PROTOCOL_INFO结构的指针,该结构定义所创建套接口的特性。如果本参数非零,则前三个参数(af, type, protocol)被忽略。
g:套接口组的描述字。
iFlags:套接口属性描述。
 
返回值:
  若无错误发生,WSASocket()返回新套接口的描述字。否则的话,返回 INVALID_SOCKET,应用程序可定调用WSAGetLastError()来获取相应的错误代码。
 
错误代码:
WSANOTINITIALISED              在调用本API之前应成功调用WSAStartup()。
WSAENETDOWN              网络子系统失效。
WSAEAFNOSUPPORT        不支持指定的地址族。
WSAEINPROGRESS           一个阻塞的WinSock调用正在进行中,或者服务提供者仍在处理一个回调函数。(参见B.3.6.6节)
WSAEMFILE                      无可用的套接口描述字。
WSAENOBUFS                   无可用的缓冲区空间。套接口无法创建。
WSAEPROTONOSUPPORT 不支持指定的协议。
WSAEPROTOTYPE             指定的协议对于本套接口类型错误。
WSAESOCKTNOSUPPORT 本地址族不支持指定的套接口类型。
WSAEINVAL                      g参数非法。
 
另请参阅:  accept(), bind(), connect(), getsockname(),getsockopt(), setsockopt(), listen(), recv(),recvfrom(), select(), send(), sendto(),shutdown(), ioctlsocket().
   

7.26 WSAWaitForMultipleEvents()

简述:只要指定事件对象中的一个或全部处于有信号状态,或者超时间隔到,则返回。
 
          #include <winsock2.h>
 
          DWORD WSAAPI WSAWaitForMultipleEvents( DWORD
          cEvents,
          const WSAEVENT FAR * lphEvents, BOOL fWaitAll,
          DWORD dwTimeout,
          BOOL fAlertable );
 
cEvents:指出lphEvents所指数组中事件对象句柄的数目。事件对象句柄的最大值为WSA_MAXIMUM_WAIT_EVENTS。
lphEvents:指向一个事件对象句柄数组的指针。
fWaitAll:指定等待类型。若为真TRUE,则当lphEvents数组中的所有事件对象同时有信号时,函数返回。若为假FALSE,则当任意一个事件对象有信号时函数即返回。在后一种情况下,返回值指出是哪一个事件对象造成函数返回。
dwTimeout:指定超时时间间隔(以毫秒计)。当超时间隔到,函数即返回,不论fWaitAll参数所指定的条件是否满足。如果dwTimeout为零,则函数测试指定的时间对象的状态,并立即返回。如果dwTimeout是WSA_INFINITE,则函数的超时间隔永远不会到。
fAlertable:指定当系统将一个输入/输出完成例程放入队列以供执行时,函数是否返回。若为真TRUE,则函数返回且执行完成例程。若为假FALSE,函数不返回,不执行完成例程。请注意在Win16中忽略该参数。
 
返回值:
  如果函数成功,返回值指出造成函数返回的事件对象。
  如果函数失败,返回值为WSA_WAIT_FAILED。可调用WSAGetLastError()来获取进一步的错误信息。
 
错误代码:
WSANOTINITIALISED              在调用本API之前应成功调用WSAStartup()。
WSAENETDOWN               网络子系统失效。
WSA_NOT_ENOUGH_MEMORY       无足够内存完成该操作。
WSA_INVALID_HANDLE    lphEvents数组中的一个或多个值不是合法的事件对象句柄。
WSA_INVALID_PARAMETER           cEvents参数未包含合法的句柄数目。
 
另请参阅:  WSACreateEvent(), WSACloseEvent().
 

附录A 错误代码

    以下列出了WSAGetLastError()函数有可能返回的错误代码和对应的解释。错误代码的数值对于所有的Windows Sockets兼容实现都是一致的。
 
Windows Sockets   Berkeley     错误数值     解释
   代码          对应代码    
 
WSAEINTR       EINTR       10004       与标准C一致
                             
WSAEBADF       EBADF     10009        与标准C一致
    
WSAEACCES      EACCES    10013        与标准C一致
                             
WSAEFAULT      EFAULT    10014        与标准C一致
                             
WSAEINVAL      EINVAL     10022       与标准C一致
                             
WSAEMFILE      EMFILE     10024       与标准C一致
 
WSAEWOULD    EWOULD    10035       与BSD一致
BLOCK           BLOCK
                       
WSAEINPRO     EINPRO      10036       当应用程序调用
GRESS          GRESS                   Windows Sockets
                                          API函数时,如果
                                          一个阻塞函数正在
                                          运行,将返回该错误。
 
WSAEALREADY  EALREADY  10037       与BSD一致
                             
WSAENOTSOCK  ENOTSOCK  10038       与BSD一致
                              
WSAEDESTADDR EDESTADDR  10039      与BSD一致
REQ             REQ   
WSAEMSGSIZE    EMSGSIZE   10040      与BSD一致
                             
WSAEPROTOTYPE  EPROTOTYPE  10041   与BSD一致
                            
WSAENOPROTO  ENOPROTOOPT  10042    与BSD一致
OPT          
                 
WSAEPROTONO  EPROTONO   10043      与BSD一致
SUPPORT        SUPPORT          
 
WSAESOCKTNO  ESOCKTNO   10044      与BSD一致
SUPPORT        SUPPORT          
 
WSAEOPNOT    EOPNOT      10045      与BSD一致
SUPPORT        SUPPORT   
                 
WSAEPFNO     EPFNO        10046      与BSD一致
SUPPORT       SUPPORT
 
WSAEAFNO    EAFNO        10047      与BSD一致
SUPPORT       SUPPORT
                   
WSAEADDRINUSE  EADDRINUSE  10048  与BSD一致
                              
WSAEADDRNOT  EADDRNOT    10049    与BSD一致
AVAIL           AVAIL
 
WSAENETDOWN    ENETDOWN  10050   与BSD一致,
                                         在Windows
                                         Sockets检测
                                         到任何底层的
                                         失败时,都有
                                         可能返回该错
                                         误。
 
WSAENETUNREAC ENETUNREACH 10051   与BSD一致
H                            
 
WSAENETRESET   ENETRESET   10052    与BSD一致
                             
WSAECONNABORT  ECONNABORTED  10053   与BSD一致
ED                           
 
WSAECONNRESET  ECONNRESET   10054     与BSD一致
                             
WSAENOBUFS     ENOBUFS   10055          与BSD一致
                              
WSAEISCONN     EISCONN    10056          与BSD一致
                             
WSAENOTCONN    ENOTCONN  10057        与BSD一致
                             
WSAESHUTDOWN   ESHUTDOWN  10058      与BSD一致
                             
WSAETOOMANYRE  ETOOMANYREFS  10059  与BSD一致
FS                           
WSAETIMEDOUT   ETIMEDOUT   10060       与BSD一致
 
WSAECONNREFUS  ECONNREFUSED  10061   与BSD一致
ED                           
 
WSAELOOP       ELOOP    10062            与BSD一致
                              
WSAENAMETOOLO  ENAMETOOLONG  10063  与BSD一致
NG                           
 
WSAEHOSTDOWN   EHOSTDOWN   10064     与BSD一致
                             
WSAEHOSTUNREA  EHOSTUNREACH  10065   与BSD一致
CH                           
 
WSASYSNOTREAD                    10091    由WSAStartup()
Y                                             函数返回,表明
                                              底层的网络子系统
                                              无法使用。
 
WSAVERNOTSUPP                    10092    由WSAStartup()
ORTED                                       函数返回,表明
                                             Windows Sockets
                                             DLL不支持这一
                                             应用。
 
WSANOTINITIAL                     10093   由除了WSAStartup()
ISED                                        的其他函数返回,表明
                                            没有对WSAStartup()函数
                                            的成功调用。
 
WSAHOST_NOT_F  HOST_NOT_FOUN  11001  与BSD一致
OUND           D
 
WSATRY_AGAIN   TRY_AGAIN        11001  与BSD一致
                             
WSANO_RECOVER  NO_RECOVERY    11003  与BSD一致
Y                            
 
WSANO_DATA     NO_DATA          11004   与BSD一致
                            

附录B Windows Sockets头文件

 

附录B.1 Windows Sockets 1.1头文件

 
/* WINSOCK.H-definitions to be used with the WINSOCK.DLL
 *
 * This header file corresponds to version 1.1 of the Windows Sockets specification.
 *
 * This file includes parts which are Copyright (c) 1982-1986 Regents
 * of the University of California.  All rights reserved.  The
 * Berkeley Software License Agreement specifies the terms and
 * conditions for redistribution.
 */
 
#ifndef _WINSOCKAPI_
#define _WINSOCKAPI_
 
/*
 * Pull in WINDOWS.H if necessary
 */
#ifndef _INC_WINDOWS
#include <windows.h>
#endif /* _INC_WINDOWS */
 
/*
 * Basic system type definitions, taken from the BSD file sys/types.h.
 */
typedef unsigned char   u_char;
typedef unsigned short  u_short;
typedef unsigned int    u_int;
typedef unsigned long   u_long;
 
/*
 * The new type to be used in all
 * instances which refer to sockets.
 */
typedef u_int           SOCKET;
 
/*
 * Select uses arrays of SOCKETs.  These macros manipulate such
 * arrays.  FD_SETSIZE may be defined by the user before including
 * this file, but the default here should be >= 64.
 *
 * CAVEAT IMPLEMENTOR and USER: THESE MACROS AND TYPES MUST BE
 * INCLUDED IN WINSOCK.H EXACTLY AS SHOWN HERE.
 */
#ifndef FD_SETSIZE
#define FD_SETSIZE      64
#endif /* FD_SETSIZE */
 
typedef struct fd_set {
        u_short fd_count;               /* how many are SET? */
        SOCKET  fd_array[FD_SETSIZE];   /* an array of SOCKETs */
} fd_set;
 
extern int PASCAL FAR __WSAFDIsSet(SOCKET, fd_set FAR *);
 
#define FD_CLR(fd, set) do { \
    u_int __i; \
    for (__i = 0; __i < ((fd_set FAR *)(set))->fd_count ; __i++) { \
        if (((fd_set FAR *)(set))->fd_array[__i] == fd) { \
            while (__i < ((fd_set FAR *)(set))->fd_count-1) { \
                ((fd_set FAR *)(set))->fd_array[__i] = \
                    ((fd_set FAR *)(set))->fd_array[__i+1]; \
                __i++; \
            } \
            ((fd_set FAR *)(set))->fd_count-; \
            break; \
        } \
    } \
} while(0)
 
#define FD_SET(fd, set) do { \
    if (((fd_set FAR *)(set))->fd_count < FD_SETSIZE) \
        ((fd_set FAR *)(set))->fd_array[((fd_set FAR *)(set))->fd_count++]=fd;\
} while(0)
 
#define FD_ZERO(set) (((fd_set FAR *)(set))->fd_count=0)
 
#define FD_ISSET(fd, set) __WSAFDIsSet((SOCKET)fd, (fd_set FAR *)set)
 
/*
 * Structure used in select() call, taken from the BSD file sys/time.h.
 */
struct timeval {
        long    tv_sec;         /* seconds */
        long    tv_usec;        /* and microseconds */
};
 
/*
 * Operations on timevals.
 *
 * NB: timercmp does not work for >= or <=.
 */
#define timerisset(tvp)         ((tvp)->tv_sec || (tvp)->tv_usec)
#define timercmp(tvp, uvp, cmp) \
        ((tvp)->tv_sec cmp (uvp)->tv_sec || \
         (tvp)->tv_sec == (uvp)->tv_sec && (tvp)->tv_usec cmp (uvp)->tv_usec)
#define timerclear(tvp)         (tvp)->tv_sec = (tvp)->tv_usec = 0
 
/*
 * Commands for ioctlsocket(),  taken from the BSD file fcntl.h.
 *
 *
 * Ioctl's have the command encoded in the lower word,
 * and the size of any in or out parameters in the upper
 * word.  The high 2 bits of the upper word are used
 * to encode the in/out status of the parameter; for now
 * we restrict parameters to at most 128 bytes.
 */
#define IOCPARM_MASK    0x7f            /* parameters must be < 128 bytes */
#define IOC_VOID        0x20000000      /* no parameters */
#define IOC_OUT         0x40000000      /* copy out parameters */
#define IOC_IN          0x80000000      /* copy in parameters */
#define IOC_INOUT       (IOC_IN|IOC_OUT)
                                        /* 0x20000000 distinguishes new &
                                           old ioctl's */
#define _IO(x,y)        (IOC_VOID|(x<<8)|y)
 
#define _IOR(x,y,t)     (IOC_OUT|(((long)sizeof(t)&IOCPARM_MASK)<<16)|(x<<8)|y)
 
#define _IOW(x,y,t)     (IOC_IN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|(x<<8)|y)
 
#define FIONREAD    _IOR('f', 127, u_long) /* get # bytes to read */
#define FIONBIO     _IOW('f', 126, u_long) /* set/clear non-blocking i/o */
#define FIOASYNC    _IOW('f', 125, u_long) /* set/clear async i/o */
 
/* Socket I/O Controls */
#define SIOCSHIWAT  _IOW('s',  0, u_long)  /* set high watermark */
#define SIOCGHIWAT  _IOR('s',  1, u_long)  /* get high watermark */
#define SIOCSLOWAT  _IOW('s',  2, u_long)  /* set low watermark */
#define SIOCGLOWAT  _IOR('s',  3, u_long)  /* get low watermark */
#define SIOCATMARK  _IOR('s',  7, u_long)  /* at oob mark? */
 
/*
 * Structures returned by network data base library, taken from the
 * BSD file netdb.h.  All addresses are supplied in host order, and
 * returned in network order (suitable for use in system calls).
 */
 
struct  hostent {
        char    FAR * h_name;           /* official name of host */
        char    FAR * FAR * h_aliases;  /* alias list */
        short   h_addrtype;             /* host address type */
        short   h_length;               /* length of address */
        char    FAR * FAR * h_addr_list; /* list of addresses */
#define h_addr  h_addr_list[0]          /* address, for backward compat */
};
 
/*
 * It is assumed here that a network number
 * fits in 32 bits.
 */
struct  netent {
        char    FAR * n_name;           /* official name of net */
        char    FAR * FAR * n_aliases;  /* alias list */
        short   n_addrtype;             /* net address type */
        u_long  n_net;                  /* network # */
};
 
struct  servent {
        char    FAR * s_name;           /* official service name */
        char    FAR * FAR * s_aliases;  /* alias list */
        short   s_port;                 /* port # */
        char    FAR * s_proto;          /* protocol to use */
};
 
struct  protoent {
        char    FAR * p_name;           /* official protocol name */
        char    FAR * FAR * p_aliases;  /* alias list */
        short   p_proto;                /* protocol # */
};
 
/*
 * Constants and structures defined by the internet system,
 * Per RFC 790, September 1981, taken from the BSD file netinet/in.h.
 */
 
/*
 * Protocols
 */
#define IPPROTO_IP              0               /* dummy for IP */
#define IPPROTO_ICMP            1               /* control message protocol */
#define IPPROTO_GGP             2               /* gateway^2 (deprecated) */
#define IPPROTO_TCP             6               /* tcp */
#define IPPROTO_PUP             12              /* pup */
#define IPPROTO_UDP             17              /* user datagram protocol */
#define IPPROTO_IDP             22              /* xns idp */
#define IPPROTO_ND              77              /* UNOFFICIAL net disk proto */
 
#define IPPROTO_RAW             255             /* raw IP packet */
#define IPPROTO_MAX             256
 
/*
 * Port/socket numbers: network standard functions
 */
#define IPPORT_ECHO             7
#define IPPORT_DISCARD          9
#define IPPORT_SYSTAT           11
#define IPPORT_DAYTIME          13
#define IPPORT_NETSTAT          15
#define IPPORT_FTP              21
#define IPPORT_TELNET           23
#define IPPORT_SMTP             25
#define IPPORT_TIMESERVER       37
#define IPPORT_NAMESERVER       42
#define IPPORT_WHOIS            43
#define IPPORT_MTP              57
 
/*
 * Port/socket numbers: host specific functions
 */
#define IPPORT_TFTP             69
#define IPPORT_RJE              77
#define IPPORT_FINGER           79
#define IPPORT_TTYLINK          87
#define IPPORT_SUPDUP           95
 
/*
 * UNIX TCP sockets
 */
#define IPPORT_EXECSERVER       512
#define IPPORT_LOGINSERVER      513
#define IPPORT_CMDSERVER        514
#define IPPORT_EFSSERVER        520
 
/*
 * UNIX UDP sockets
 */
#define IPPORT_BIFFUDP          512
#define IPPORT_WHOSERVER        513
#define IPPORT_ROUTESERVER      520
                                        /* 520+1 also used */
 
/*
 * Ports < IPPORT_RESERVED are reserved for
 * privileged processes (e.g. root).
 */
#define IPPORT_RESERVED         1024
 
/*
 * Link numbers
 */
#define IMPLINK_IP              155
#define IMPLINK_LOWEXPER        156
#define IMPLINK_HIGHEXPER       158
 
/*
 * Internet address (old style... should be updated)
 */
struct in_addr {
        union {
                struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
                struct { u_short s_w1,s_w2; } S_un_w;
                u_long S_addr;
        } S_un;
#define s_addr  S_un.S_addr
                                /* can be used for most
 

评分:0

我来说两句

seccode