下面以表格的形式列出了WSAGetLastError()函数有可能返回的错误代码和对应的解释。错误代码的数值对于所有的Windows Sockets兼容实现都是一致的。
错误代码 | Berkeley对应代码 | 错误数值 | 说明 |
WSAEINTR | EINT | 10004 | 函数调用中断。该错误表明由于对WSACancelBlockingCall的调用,造成了一次调用被强行中断。 |
WSAEBADF | EBADF | 10009 | 文件句柄错误。该错误表明提供的文件句柄无效。 |
WSAEACCES | EACCES | 10013 | 权限被拒。尝试对套接字进行操作,但被禁止。若试图在sendto或WSASendTo中使用一个广播地址,但是尚未用setsockopt和SO_BROADCAST这两个选项设置广播权限,便会产生这类错误。 |
WSAEFAULT | EFAULT | 10014 | 地址无效。传给Winsock函数的指针地址无效。若指定的缓冲区太小,也会产生这个错误。 |
WSAEINVAL | EINVAL | 10022 | 参数无效。指定了一个无效参数。例如,假如为WSAIoctl调用指定了一个无效控制代码,便会产生这个错误。另外,它也可能表明套接字当前的状态有错,例如在一个目前没有监听的套接字上调用accept或WSAAccept。 |
WSAEMFILEBLOCK | EMFILEBLOCK | 10024 | 打开文件过多。提示打开的套接字太多了。通常,Microsoft提供者只受到系统内可用资源数量的限制。 |
WSAEINPRO | EINPRO | 10036 | 资源暂时不可用。对非锁定套接字来说,如果请求操作不能立即执行的话,通常会返回这个错误。比如说,在一个非暂停套接字上调用conn ect,就会返回这个错误。因为连接请求不能立即执行。 |
GRESS | GRESS | 操作正在进行中。当前正在执行非锁定操作。一般来说不会出现这个错误,除非正在开 发1 6 位Wi n s o c k 应用程序。 | |
WSAEALREADY | EALREADY | 10037 | 操作已完成。一般来说,在非锁定套接字上尝试已处于进程中的操作时,会产生这个错误。比如,在一个已处于连接进程的非锁定套接字上,再一次调用connect或WSAConnect。另外,服务提供者处于执行回调函数(针对支持回调例程的Winsock函数)的进程中时,也会出现这个错误。 |
WSAENOTSOCK | ENOTSOCK | 10038 | 无效套接字上的套接字操作。任何一个把SOCKET句柄当作参数的Winsock函数都会返回这个错误。它表明提供的套接字句柄无效。 |
续表
错误代码 | Berkeley对应代码 | 错误数值 | 说明 |
WSAEDESTADDRREQ | EDESTADDRREQ | 10039 | 需要目标地址。这个错误表明没有提供具体地址。比方说,假如在调用sendto时,将目标地址设为INADDR_ANY(任意地址),便会返回这个错误。 |
WSAEMSGSIZE | EMSGSIZE | 10040 | 消息过长。这个错误的含义很多。如果在一个数据报套接字上发送一条消息,这条消息对内部缓冲区而言太大的话,就会产生这个错误。再比如,由于网络本身的限制,使一条消息过长,也会产生这个错误。最后,如果收到数据报之后,缓冲区太小,不能接收消息时,也会产生这个错误。 |
WSAEPROTOTYPE | EPROTOTYPE | 10041 | 套接字协议类型有误。在socket或WSASocket 调用中指定的协议不支持指定的套接字类型。比如,要求建立SOCK_STREAM类型的一个IP套接字,同时指定协议为IPPROTO_UDP,便会产生这样的错误。 |
WSAENOPROTOOPT | ENOPROTOOPT | 10042 | 协议选项错误。表明在getsockopt或setsockopt 调用中,指定的套接字选项或级别不明、未获支持或者无效。 |
WSAEPROTONOUPPORT | EPROTONOSUPPORT | 10043 | 不支持的协议。系统中没有安装请求的协议或没有相应的实施方案。比如,如果系统中没有安装TCP/IP,而试着建立TCP或UDP套接字时,就会产生这个错误。 |
WSAESOCKTNOSUPPORT | ESOCKTNOSUPPORT | 10044 | 不支持的套接字类型。对指定的地址家族来说,没有相应的具体套接字类型支持。比如,在向一个不支持原始套接字的协议请求建立一个SOCK_RAW套接字类型时,就会产生这个错误。 |
WSAEOPNOTSUPPORT | EOPNOTSUPPORT | 10045 | 不支持的操作。表明针对指定的对象,试图采取的操作未获支持。通常,如果试着在一个不支持调用Winsock函数的套接字上调用了Winsock时,就会产生这个错误。 |
WSAEPFNOSUPPORT | EPFNOSUPPORT | 10046 | 不支持的协议家族。请求的协议家族不存在,或系统内尚未安装。多数情况下,这个错误可与WSAEAFNOSUPPORT互换(两者等价);后者出现得更为频繁。 |
WSAEAFNOSUPPORT | EAFNOSUPPORT | 10047 | 地址家族不支持请求的操作。对套接字类型不支持的操作来说,在试着执行它时,就会出现这个错误。比如,在类型为SOCK_STREAM的一个套接字上调用sendto或WSASendTo函数时,就会产生这个错误。另外,在调用socket或WSASocket函数的时候,若同时请求了一个无效的地址家族、套接字类型及协议组合,也会产生这个错误。 |
续表
错误代码 | Berkeley对应代码 | 错误数值 | 说明 |
WSAEADDRINUSE | EADDRINUSE | 10048 | 地址正在使用。正常情况下,每个套接字只允许使用一个套接字地址这个错误一般和bind、connect和WSAConnect这三个函数有关。可在setsockopt函数中设置套接字选项SO_REUSEA D D R ,允许多个套接字访问同一个本地I P 地址及端口号 |
WSAEADDRNOTAVAIL | EADDRNOTAVAIL | 10049 | 不能分配请求的地址。API调用中指定的地址对那个函数来说无效时,就会产生这样的错误。例如,若在bind调用中指定一个IP地址,但却没有对应的本地IP接口,便会产生这样的错误。另外,通过connect、WSAConnect、sendto、WSASendTo和WSAJoinLeaf这四个函数为准备连接的远程计算机指定端口0时,也会产生这样的错误。 |
WSAENETDOWN | ENETDOWN | 10050 | 网络断开。试图采取一项操作时,却发现网络连接中断。这可能是由于网络堆栈的错误,网络接口的故障,或者本地网络的问题造成的。 |
WSAENETUNREACH | ENETUNREACH | 10051 | 网络不可抵达。试图采取一项操作时,却发现目标网络不可抵达(不可访问)。这意味着本地主机不知道如何抵达一个远程主机。换言之,目前没有已知的路由可抵达那个目标主机。 |
WSAENETRESET | ENETRESET | 10052 | 网络重设时断开了连接。由于“保持活动”操作检测到一个错误,造成网络连接的中断。若在一个已经无效的连接之上,通过setsockopt函数设置SO_KEEPALIVE选项,也会出现这样的错误。 |
WSAECONNABORTED | ECONNABORTED | 10053 | 软件造成连接取消。由于软件错误,造成一个已经建立的连接被取消。典型情况下,这意味着连接是由于协议或超时错误而被取消的。 |
WSAECONNRESET | ECONNRESET | 10054 | 连接被对方重设。一个已经建立的连接被远程主机强行关闭。若远程主机上的进程异常中止运行(由于内存冲突或硬件故障),或者针对套接字执行了一次强行关闭,便会产生这样的错误。针对强行关闭的情况,可用SO_LINGER套接字选项和setsockopt来配置一个套接字 |
WSAENOBUFS | ENOBUFS | 10055 | 没有缓冲区空间。由于系统缺少足够的缓冲区空间,请求的操作不能执行。 |
WSAEISCONN | EISCONN | 10056 | 套接字已经连接。表明在一个已建立连接的套接字上,试图再建立一个连接。要注意的是,数据报和数据流套接字均有可能出现这样的错误。使用数据报套接字时,假如事先已通过connect或WSAConnect调用,为数据报通信关联了一个端点的地址,那么以后试图再次调用sendto或WSASendTo,便会产生这样的错误。 |
WSAENOTCONN | ENOTCONN | 10057 | 套接字尚未连接。若在一个尚未建立连接的“面向连接”套接字上发出数据收发请求,便会产生这样的错误。 |
续表
错误代码 | Berkeley对应代码 | 错误数值 | 说明 |
WSAESHUTDOWN | ESHUTDOWN | 10058 | 套接字关闭后不能发送。表明已通过对shutdown的一次调用,部分关闭了套接字,但后又请求进行数据的收发操作。要注意的是,这种错误只会在已经关闭的那个数据流动方向上才会发生。举个例子来说,完成数据发送后,若调用shutdown,那么以后任何数据发送调用都会产生这样的错误。 |
WSAETIMEDOUT | ETIMEDOUT | 10060 | 连接超时。若发出了一个连接请求,但经过规定的时间,远程计算机仍未作出正确的响应(或根本没有任何响应),便会发生这样的错误。要想收到这样的错误,通常需要先在套接字上设置好SO_SNDTIMEO和SO_RCVTIMEO选项,然后调用connect及WSAConnect函数。 |
WSAECONNREFUSED | ECONNREFUSED | 10061 | 连接被拒。由于被目标机器拒绝,连接无法建立。这通常是由于在远程机器上,没有任何应用程序可在那个地址之上,为连接提供服务。 |
WSAEHOSTDOWN | EHOSTDOWN | 10064 | 主机关闭。这个错误指出由于目标主机关闭,造成操作失败。然而,应用程序此时更有可能收到的是一条WSAETIMEDOUT(连接超时)错误,因为对方关机的情况通常是在试图建立一个连接的时候发生的。 |
WSAEHOSTUNREACH | EHOSTUNREACH | 10065 | 没有到主机的路由。应用程序试图访问一个不可抵达的主机。该错误类似于WSAENETUNREACH。 |
WSASYSNOTREAY | 10091 | 网络子系统不可用。调用WSAStartup时,若提供者不能正常工作(由于提供服务的基层系统不可用),便会返回这种错误。 | |
WSAVERNOTSUPPORTED | 10092 | Winsock. dll版本有误。表明不支持请求的Winsock提供者版本。 | |
WSANOTINITIAL ISED | 10093 | Winsock尚未初始化。尚未成功完成对WSAStartup的一次调用 |