您的位置:首页 > 其它

【转】WSAGetLastError()调用获取更多的错误信息。

2009-06-01 16:43 537 查看
WSAGetLastError()调用获取更多的错误信息。

错误代码:
WSANOTINITIALISED 在调用本API之前应成功调用WSAStartup()。
WSAENETDOWN 网络子系统失效。
WSA_INVALID_HANDLE hEvent不是一个合法的事件对象句柄。

另请参阅: WSACreateEvent(), WSAEnumNetworkEvents(),WSAEventSelect(),
WSAGetOverlappedResult(),WSARecv(), WSARecvFrom(),
WSAResetEvent(),WSASend(), WSASendTo(),
WSASetEvent(),WSAWaitForMultipleEvents().

7.3 WSAConnect()
简述:创建一个与远端的连接,交换连接数据,并根据所提供的流描述确定所需的
服务质量。

#include <winsock2.h>

int WSAAPI WSAConnect ( SOCKET s, const struct
sockaddr FAR * name,
int namelen, LPWSABUF lpCallerData, LPWSABUF
lpCalleeData,
LPQOS lpSQOS, LPQOS lpGQOS );

s:用于描述一个未连接套接口的描述字。
name:欲与套接口连接的远端名字。
namelen:名字长度。
lpCallerData:指向用户数据的指针,该数据在建立连接时将传送到远端。
lpCalleeData:指向用户数据的指针,该数据在建立连接时将从远端传送回本机。
lpSQOS:指向套接口s流描述的指针,每个方向一个。
lpGQOS:指向套接口组流描述的指针。(如果有套接口组的话)

返回值:
如果无错误发生,WSAConnect()返回0。否则的话,将返回INVALID_SOCKET
错误,应用程序可通过WSAGetLastError()来获取相应的错误代码。
对于阻塞套接口来说,返回值表示连接试图是否成功。
对于非阻塞套接口来说,连接试图不一定马上完成。在这种情况下,WSAConnect()
返回SOCKET_ERROR,且WSAGetLastError()返回WSAEWOULDBLOCK. 此时应
用程序可以:
1。利用select()函数,通过检查套接口是否可写来判断连接请求是否完成。或者,
2。如果应用程序已使用WSAAsyncSelect()函数来确定对连接事件的兴趣,则当连
接操作完成时应用程序将收到FD _CONNECT通知。或者,
3。如果应用程序已使用WSAEventSelect()函数来确定对连接事件的兴趣,则当连
接操作完成时相应的事件对象将设置信号。
对于一个非阻塞套接口来说,在连接试图完成之前,任何对该套接口的
WSAConnect()调用都将以WSAEALREADY错误失败。
如果返回值指出连接试图失败(例如WSAECONNREFUSED,
WSAENETUNREACH,WSAETIMEDOUT)则应用程序可对该套接口再次调用
WSAConnect()函数。

错误代码:
WSANOTINITIALISED 在调用本API之前应成功调用WSAStartup()。
WSAENETDOWN 网络子系统失效。
WSAEADDRINUSE 所指地址已被使用。
WSAEINTR 通过WSACancelBlockingCall()函数中止了阻塞调用。
WSAEINPROGRESS 一个阻塞的WinSock调用正在进行中,或者服务提供者
仍在处理一个回调函数。(参见B.3.6.6节)
WSAEALREADY 在所指定的套接口上正在进行一个非阻塞的connect()
或WSAConnect()调用。
WSAEADDRNOTAVAIL 本地机器上无法获得所指定的地址。
WSAEAFNOSUPPORT 所指定地址族中的地址无法与本套接口一起使用。
WSAECONNREFUSED 连接试图被拒绝。
WSAEFAULT name或namelen参数不是用户地址空间的一个有效部
分;namelen参数太小; lpCalleeData、 lpSQOS和lpGQOS的缓冲区太小;或者
lpCallerData的缓冲区太大。
WSAEINVAL 套接口已与一个地址捆绑。
WSAEINVAL 套接口未与一个地址捆绑。
WSAEINVAL s参数为监听套接口。
WSAEISCONN 套接口已经连接(仅适用于面向连接的套接口)。
WSAENETUNREACH 当前无法从本主机联系网络。
WSAENOBUFS 无可用缓冲区,套接口未连接。
WSAENOTSOCK 描述字不是一个套接口。
WSAEOPNOTSUPP lpSQOS和lpGQOS中的流描述无法满足。
WSAEPROTONOSUPPORT 服务提供者不支持lpCallerData参数。
WSAETIMEDOUT 连接试图超时,连接未建立。
WSAEWOULDBLOCK 套接口标志为非阻塞,连接无法立即完成。当套接口用
select()函数设置为读时,可调用select()。
WSAEACCES 由于setsockopt()时未允许SO_BROADCAST,无法将一
个数据报套接口与一个广播地址连接。

另请参阅: accept(), bind(), connect(), getsockname(),getsockopt(), socket(),
select(),
WSAAsyncSelect(), WSAEventSelect().

7.4 WSACreateEvent()
简述:创建一个新的事件对象。

#include <winsock2.h>

WSAEVENT WSAAPI WSACreateEvent( VOID );

返回值:
如果函数成功,则返回值即是事件对象的句柄。
如果函数失败,返回WSA_INVALID_EVENT。应用程序可通过调用
WSAGetLastError()函数获取进一步的错误信息。

错误代码:
WSANOTINITIALISED 在调用本API之前应成功调用WSAStartup()。
WSAENETDOWN 网络子系统失效。
WSA_NOT_ENOUGH_MEMORY 无足够内存创建事件对象。

另请参阅: WSACloseEvent(), WSAEnumNetworkEvents(),WSAEventSelect(),
WSAGetOverlappedResult(),WSARecv(), WSARecvFrom(),
WSAResetEvent(),WSASend(), WSASendTo(),
WSASetEvent(),WSAWaitForMultipleEvents().

7.5 WSADuplicateSocket()
简述:为一个共享套接口创建一个新的描述字。

#include <winsock2.h>

SOCKET WSAAPI WSADuplicateSocket ( SOCKET s,
WSATASK hTargetTask );

s:指定本地套接口描述字。
hTargetTask:指定使用共享套接口的目标任务的句柄。

返回值:
若无错误发生,WSADuplicateSocket()返回新的套接口描述字。否则的话,将返回
INVALID_SOCKET错误,应用程序可通过WSAGetLastError()来获取相应的错误代
码。

错误代码:
WSANOTINITIALISED 在调用本API之前应成功调用WSAStartup()。
WSAENETDOWN 网络子系统失效。
WSAEINVAL 参数中有非法值。
WSAEINPROGRESS 一个阻塞的WinSock调用正在进行中,或者服务提供者
仍在处理一个回调函数。(参见B.3.6.6节)
WSAEMFILE 无可用套接口描述字。
WSAENOBUFS 无可用缓冲区空间,套接口未创建。
WSAENOTSOCK 描述字不是一个套接口。

另请参阅:

7.6 WSAEnumNetworkEvents()
简述:检测所指定套接口上网络事件的发生。

#include <winsock2.h>

int WSAAPI WSAEnumNetworkEvents ( SOCKET s,
WSAEVENT hEventObject, LPWSANETWORKEVENTS
lpNetworkEvents, LPINT lpiCount);

s:标识套接口的描述字。
hEventObject:(可选)句柄,用于标识需要复位的相应事件对象。
lpNetworkEvents:一个WSANETWORKEVENTS结构的数组,每一个元素记录了一
个网络事件和相应的错误代码。
lpiCount:数组中的元素数目。在返回时,本参数表示数组中的实际元素数目;如果
返回值是WSAENOBUFS,则表示为获取所有网络事件所需的元素数目。

返回值:
如果操作成功则返回0。否则的话,将返回INVALID_SOCKET错误,应用程序
可通过WSAGetLastError()来获取相应的错误代码。

错误代码:
WSANOTINITIALISED 在调用本API之前应成功调用WSAStartup()。
WSAENETDOWN 网络子系统失效。
WSAEINVAL 参数中有非法值。
WSAEINPROGRESS 一个阻塞的WinSock调用正在进行中,或者服务提供者
仍在处理一个回调函数。(参见B.3.6.6节)
WSAENOBUFS 所提供的缓冲区太小。

另请参阅: WSAEventSelect()

7.7 WSAEnumProtocols()
简述:获取现有传送协议的相关信息。

#include <winsock2.h>

int WSAAPI WSAEnumProtocols ( LPDWORD
lpdwProtocols, LPVOID lpProtocolBuffer, LPDWORD
lpdwBufferLength);

lpdwProtocols:一个以NULL结尾的协议标识号数组。本参数可选;如果lpdwProtocols
为 NULL,则返回所有可用协议的信息,否则的话只返回数组中所开列的协议信
息。
lpProtocolBuffer:一个用PROTOCOL_INFO结构填充的缓冲区。参见下文中对
PROTOCOL_INFO结构的具体描述。
lpdwBufferLength:输入时,存有传递给WSAEnumProtocols()函数的lpProtocolBuffer
缓冲区长度。输出时,表示为获取所有信息需传递给WSAEnumProtocols()函数的缓
冲区长度。本函数不能重复调用;传入的缓冲区必须足够大以能存放所有的元素。
这个规定降低了该函数的复杂度。由于一个机器上装载的协议数目往往是很小的,
所以并不会产生问题。

返回值:
若无错误发生,WSAEnumProtocols()返回协议的数目。否则的话,将返回
INVALID_SOCKET错误,应用程序可通过WSAGetLastError()来获取相应的错误代
码。

错误代码:
WSANOTINITIALISED 在调用本API之前应成功调用WSAStartup()。
WSAENETDOWN 网络子系统失效。
WSAEINPROGRESS 一个阻塞WinSock调用正在进行。
WSAEINVAL 参数中有非法值。
WSAENOBUFS 缓冲区太小,无法保存所有PROTOCOL_INFO结构及其相
关信息。传入的缓冲区大小至少应等于lpdwBufferLength中返回的值。

7.8 WSAEventSelect()
简述:确定与所提供的FD_XXX网络事件集合相关的一个事件对象。

#include <winsock2.h>

int WSAAPI WSAEventSelect ( SOCKET s, WSAEVENT
hEventObject, long lNetworkEvents );

s:一个标识套接口的描述字。
hEventObject:一个句柄,用于标识与所提供的FD_XXX网络事件集合相关的一个
事件对象。
lNetworkEvents:一个屏蔽位,用于指定感兴趣的FD_XXX网络事件组合。

返回值:
如果应用程序指定的网络事件及其相应的事件对象成功设置,则返回0。否则的
话,将返回INVALID_SOCKET错误,应用程序可通过WSAGetLastError()来获取相
应的错误代码。
在使用select()和WSAAsyncSelect()函数时,WSAEventSelect()常用来决定何时进行
数据传送操作(如send()或recv()),并期望能立即成功。但是一个稳定的应用程序
应该做好这样的准备,即事件对象被设置,并且一个WinSock调用以
WSAEWOULDBLOCK立即返回 。举例来说,有可能发生下述操作序列:

(i) 套接口s上到达数据;WinSock设置了WSAEventSelect事件对象。
(ii) 应用程序进行其他操作。
(iii) 在进行操作时,应用程序调用了ioctlsocket(s, FIONREAD...)并发现有数据可读。
(iv) 应用程序调用一个recv(s,...)来读取数据。
(v) 最后应用程序等待WSAEventSelect()所指定的数据对象,该数据对象指出数据可
读。
(vi) 应用程序调用recv(s,...),但以WSAEWOULDBLOCK错误失败。

其他的操作序列也是可能的。
成功地记录了网络事件的发生(通过设置内部网络事件记录的相应位),并且将
相应的事件对象设置了信号后,不会对该网络事件作进一步的操作,直到应用程序
调用了相应的函数显式地重新允许该网络事件及相应事件对象的信号。
网络事件 重新允许函数
FD_READ recv() 或 recvfrom()
FD_WRITE send() 或 sendto()
FD_OOB recv()
FD_ACCEPT accept() 或WSAAccept(),直到返回的错误代码为
WSATRY_AGAIN,指明条件函数返回CF_DEFER。
FD_CONNECT NONE
FD_CLOSE NONE
FD_QOS 用SIO_GET_QOS 命令调用WSAIoctl()。
FD_GROUP_QOS 用SIO_GET_GROUP_QOS命令调用WSAIoctl()。

错误代码:
WSANOTINITIALISED 在调用本API之前应成功调用WSAStartup()。
WSAENETDOWN 网络子系统失效。
WSAEINVAL 参数中有非法值,或者指定的套接口处于非法状态。
WSAEINPROGRESS 一个阻塞的WinSock调用正在进行中,或者服务提供者
仍在处理一个回调函数。(参见B.3.6.6节)
WSAENOTSOCK 描述字不是一个套接口。

另请参阅:
WSACloseEvent() ,WSACreateEvent(),WSAEnumNetworkEvents(),WSAGetOverlapped
Result(),WSAWaitForMultipleEvents().

7.9 WSAGetOverlappedResult()
简述:返回指定套接口上一个重叠操作的结果。

#include <winsock2.h>

BOOL WSAAPI WSAGetOverlappedResult( SOCKET s,
LPWSAOVERLAPPED lpOverlapped, LPDWORD
lpcbTransfer, BOOL fWait, LPDWORD lpdwFlags );

s:标识套接口。这就是调用重叠操作(WSARecv()、 WSARecvFrom()、WSASend()、
WSASendTo() 或 WSAIoctl())时指定的那个套接口。
lpOverlapped:指向调用重叠操作时指定的WSAOVERLAPPED结构。
lpcbTransfer:指向一个32位变量,该变量用于存放一个发送或接收操作实际传送的
字节数,或WSAIoctl()传送的字节数。
fWait:指定函数是否等待挂起的重叠操作结束。若为真TRUE则函数在操作完成后
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: