Windows 套接字错误代码

大多数 Windows 套接字 2 函数在函数返回时不返回错误的具体原因。 有关信息,请参阅 处理 Winsock 错误 主题。

WSAGetLastError 函数返回调用线程发生的最后一个错误。 当特定的 Windows 套接字函数指示发生了错误时,应立即调用此函数以检索失败的函数调用的扩展错误代码。 这些错误代码和与错误代码关联的短文本说明在 Winerror.h 头文件中定义。 FormatMessage 函数可用于获取返回错误的消息字符串。

有关如何在将套接字应用程序移植到 Winsock 时处理错误代码的信息,请参阅 错误代码 - errno、h_errno 和 WSAGetLastError

以下列表描述了 WSAGetLastError 函数返回的可能错误代码。 错误按数字顺序列出,并带有错误宏名称。 Winsock2.h 头文件中定义的某些错误代码不会从任何函数返回。

返回代码/值 说明
WSA_INVALID_HANDLE
6
指定的事件对象句柄无效。
应用程序尝试使用事件对象,但指定的句柄无效。
WSA_NOT_ENOUGH_MEMORY
8
可用内存不足。
应用程序使用了直接映射到 Windows 函数的 Windows 套接字函数。 Windows 函数指示缺少所需的内存资源。
WSA_INVALID_PARAMETER
87
一个或多个参数无效。
应用程序使用了直接映射到 Windows 函数的 Windows 套接字函数。 Windows 函数指示一个或多个参数存在问题。
WSA_OPERATION_ABORTED
995
已中止重叠操作。
由于套接字关闭或在 WSAIoctl 中执行 SIO_FLUSH 命令,因此取消了重叠操作。
WSA_IO_INCOMPLETE
996
未处于信号状态的重叠 I/O 事件对象。
应用程序已尝试确定尚未完成的重叠操作的状态。 使用 WSAGetOverlappedResult 的应用程序在轮询模式下将 fWait 标志设置为 FALSE) (,以确定重叠操作何时完成,获取此错误代码,直到操作完成。
WSA_IO_PENDING
997
重叠的操作稍后将完成。
应用程序已启动一个无法立即完成的重叠操作。 操作完成后,稍后将提供完成指示。
WSAEINTR
10004
函数调用中断。
调用 WSACancelBlockingCall 中断了阻止操作。
WSAEBADF
10009
文件句柄无效。
提供的文件句柄无效。
WSAEACCES
10013
权限被拒绝。
尝试以被其访问权限禁止的方式访问套接字。 例如,使用 setockopt (SO_BROADCAST) 为 sendto 使用广播地址,而无需设置广播权限。
WSAEACCES 错误的另一个可能原因是,在 Windows NT 4.0 上调用绑定函数 (SP4 及更高版本) 时,另一个应用程序、服务或内核模式驱动程序将绑定到具有独占访问权限的同一地址。 这种独占访问是 sp4 及更高版本Windows NT 4.0 的新功能,通过使用 SO_EXCLUSIVEADDRUSE 选项实现。
WSAEFAULT
10014
地址错误。
系统在尝试使用调用的指针参数时检测到指针地址无效。 如果应用程序传递的指针值无效,或者缓冲区的长度太小,则会发生此错误。 例如,如果参数( sockaddr 结构)的长度小于 sockaddr () 的大小。
WSAEINVAL
10022
参数无效。
例如, (为 setsockopt 函数指定无效级别) 提供了一些无效参数。 在某些情况下,它还指套接字的当前状态,例如,在未侦听的套接字上调用 accept
WSAEMFILE
10024
打开的文件太多。
打开的套接字太多。 每个实现可能具有全局、每个进程或每个线程的最大可用套接字句柄数。
WSAEWOULDBLOCK
10035
资源暂时不可用。
此错误是从无法立即完成的非阻止套接字上的操作返回的,例如,在没有排队要从套接字读取数据时进行 recv 。 这是一个非致命错误,应稍后重试该操作。 WSAEWOULDBLOCK 在非阻止SOCK_STREAM套接字上调用 连接 是正常的,因为必须经过一段时间才能建立连接。
WSAEINPROGRESS
10036
操作现在正在进行中。
阻止操作当前正在执行。 Windows 套接字仅允许单个阻止操作(每个任务或线程)未完成,如果进行了任何其他函数调用, (它是否引用该套接字或任何其他套接字) 函数将失败并出现 WSAEINPROGRESS 错误。
WSAEALREADY
10037
操作已在进行中。
在操作已在正在进行的非阻止套接字上尝试了一个操作,即在已 连接的 非阻止套接字上调用第二次连接,或者取消已取消或已完成的 WSAAsyncGetXbyY) (异步请求。
WSAENOTSOCK
10038
nonsocket 上的套接字操作。
尝试对不是套接字的内容执行操作。 套接字句柄参数未引用有效的套接字,或者对于 selectfd_set 的成员无效。
WSAEDESTADDRREQ
10039
需要目标地址。
套接字上的操作中省略了所需的地址。 例如,如果使用远程地址ADDR_ANY调用 sendto ,则返回此错误。
WSAEMSGSIZE
10040
消息太长。
在数据报套接字上发送的消息大于内部消息缓冲区或其他网络限制,或者用于接收数据报的缓冲区小于数据报本身。
WSAEPROTOTYPE
10041
套接字的协议类型错误。
套接字 函数调用中指定了不支持所请求的套接字类型的语义的协议。 例如,不能使用套接字类型指定 ARPA Internet UDP 协议SOCK_STREAM。
WSAENOPROTOOPT
10042
协议选项错误。
getsockoptsetsockopt 调用中指定了未知、无效或不支持的选项或级别。
WSAEPROTONOSUPPORT
10043
不支持协议。
请求的协议尚未配置到系统中,或者不存在任何实现。 例如, 套接字 调用请求SOCK_DGRAM套接字,但指定流协议。
WSAESOCKTNOSUPPORT
10044
不支持套接字类型。
在此地址族中不存在对指定的套接字类型的支持。 例如,可选类型SOCK_RAW可能在 套接字 调用中选择,并且实现根本不支持SOCK_RAW套接字。
WSAEOPNOTSUPP
10045
不支持操作。
所引用对象的类型不支持尝试的操作。 当不支持此操作的套接字的套接字描述符尝试接受数据报套接字上的连接时,通常会发生这种情况。
WSAEPFNOSUPPORT
10046
不支持协议系列。
协议系列尚未配置到系统中,或者不存在任何实现。 此消息的含义与 WSAEAFNOSUPPORT 略有不同。 但是,在大多数情况下,它是可互换的,并且返回这些消息之一的所有 Windows 套接字函数也指定 WSAEAFNOSUPPORT。
WSAEAFNOSUPPORT
10047
协议系列不支持的地址系列。
使用了与请求的协议不兼容的地址。 所有套接字都是使用关联的地址系列 ((即 Internet 协议) AF_INET)和泛型协议类型 ((即SOCK_STREAM) )创建的。 如果在 套接字 调用中显式请求了错误的协议,或者将错误系列的地址用于套接字(例如,在 sendto 中),则返回此错误。
WSAEADDRINUSE
10048
地址已在使用中。
通常,每个套接字地址 (协议/IP 地址/端口) 只允许使用一次。 如果应用程序尝试 将套接字绑定到 已用于现有套接字的 IP 地址/端口、未正确关闭的套接字或仍在关闭过程中的套接字,则会发生此错误。 对于需要将多个套接字 绑定到 同一端口号的服务器应用程序,请考虑使用 setsockopt (SO_REUSEADDR) 。 客户端应用程序通常根本不需要调用 bind - 连接 会自动选择未使用的端口。 当使用涉及ADDR_ANY) 的通配符地址 (调用 绑定 时,WSAEADDRINUSE 错误可能会延迟到提交特定地址。 稍后调用另一个函数(包括 connectlistenWSAConnectWSAJoinLeaf)可能会发生这种情况。
WSAEADDRNOTAVAIL
10049
无法分配请求的地址。
请求的地址在其上下文中无效。 这通常是由于尝试 绑定到 对本地计算机无效的地址。 当远程地址或端口对远程计算机无效时,也可能导致 连接sendtoWSAConnectWSAConnect、WSAJoinLeafWSASendTo , (地址或端口 0) 。
WSAENETDOWN
10050
网络已关闭。
套接字操作遇到了一个已死的网络。 这可能表明网络系统(也就时说,Windows Sockets DLL 的协议堆栈溢出)、网络接口或局域网本身出现严重故障。
WSAENETUNREACH
10051
无法访问网络。
尝试对无法访问的网络执行套接字操作。 这通常意味着本地软件不知道到达远程主机的路由。
WSAENETRESET
10052
重置时网络连接断开。
连接已中断,因为保持活动活动检测到操作正在进行时失败。 如果尝试在已失败的连接上设置SO_KEEPALIVE则 setsockopt 也可以返回它。
WSAECONNABORTED
10053
软件导致连接中止。
已建立的连接被主计算机中的软件中止,可能是由于数据传输超时或协议错误。
WSAECONNRESET
10054
按对等方重置连接。
远程主机强行关闭现有连接。 这通常会导致远程主机上的对等应用程序突然停止、主机重新启动、主机或远程网络接口被禁用,或者远程主机使用硬关闭 (有关远程套接字) SO_LINGER选项的详细信息,请参阅 setsockopt 。 如果在一个或多个操作正在进行时,由于保持连接活动检测到失败,也可能导致此错误。 正在进行的操作失败,WSAENETRESET。 后续操作失败并显示 WSAECONNRESET。
WSAENOBUFS
10055
没有可用的缓冲区空间。
无法对套接字执行操作,因为系统缺少足够的缓冲区空间或队列已满。
WSAEISCONN
10056
套接字已连接。
已在已连接的套接字上发出连接请求。 如果针对SOCK_STREAM套接字在连接的SOCK_DGRAM套接字 (上调用 sendto,则某些实现也会返回此错误,sendto 中的 to 参数将被忽略) 尽管其他实现将此视为合法事件。
WSAENOTCONN
10057
套接字未连接。
不允许发送或接收数据的请求,因为未连接套接字,并且使用 sendto 在数据报套接字上发送时 () 未提供地址。 任何其他类型的操作也可能返回此错误,例如,如果连接已重置,则 setsockopt 设置 SO_KEEPALIVE
WSAESHUTDOWN
10058
套接字关闭后无法发送。
不允许发送或接收数据的请求,因为该套接字已在该方向上关闭,并进行了上一次 关闭 调用。 通过调用 关闭 ,请求部分关闭套接字,这是一个信号,表示已停止发送或接收,或两者都已停止。
WSAETOOMANYREFS
10059
引用过多。
对某些内核对象的引用过多。
WSAETIMEDOUT
10060
连接超时。
连接尝试失败,因为连接的一段时间后未正确响应,或者建立的连接失败,因为连接的主机无法响应。
WSAECONNREFUSED
10061
连接被拒绝。
无法建立连接,因为目标计算机主动拒绝连接。 这通常是由于尝试连接到外部主机上处于非活动状态的服务(即未运行任何服务器应用程序的服务)。
WSAELOOP
10062
无法转换名称。
无法转换名称。
WSAENAMETOOLONG
10063
名称太长。
名称组件或名称过长。
WSAEHOSTDOWN
10064
主机已关闭。
由于目标主机关闭,套接字操作失败。 套接字操作遇到死主机。 尚未启动本地主机上的网络活动。 错误 WSAETIMEDOUT 更有可能指示这些条件。
WSAEHOSTUNREACH
10065
没有到主机的路由。
套接字操作尝试访问无法访问的主机。 请参阅 WSAENETUNREACH。
WSAENOTEMPTY
10066
目录不为空。
无法删除不为空的目录。
WSAEPROCLIM
10067
进程太多。
Windows 套接字实现可能对可以同时使用它的应用程序数有限制。 如果已达到限制,WSAStartup 可能会失败并出现此错误。
WSAEUSERS
10068
超出用户配额。
用完用户配额。
WSAEDQUOT
10069
超出磁盘配额。
磁盘配额已用完。
WSAESTALE
10070
过时的文件句柄引用。
文件句柄引用不再可用。
WSAEREMOTE
10071
项是远程的。
该项在本地不可用。
WSASYSNOTREADY
10091
网络子系统不可用。
如果 Windows 套接字实现目前无法正常工作,则 WSAStartup 将返回此错误,因为它用于提供网络服务的基础系统当前不可用。 用户应检查:
  • 相应的 Windows 套接字 DLL 文件位于当前路径中。
  • 他们不会尝试同时使用多个 Windows 套接字实现。 如果系统上有多个 Winsock DLL,请确保路径中的第一个 DLL 适用于当前加载的网络子系统。
  • Windows 套接字实现文档,以确保当前正确安装和配置所有必要的组件。
WSAVERNOTSUPPORTED
10092
Winsock.dll版本范围外。
当前的 Windows 套接字实现不支持应用程序请求的 Windows 套接字规范版本。 检查没有访问任何旧的 Windows 套接字 DLL 文件。
WSANOTINITIALISED
10093
尚未成功执行 WSAStartup。
应用程序未调用 WSAStartupWSAStartup 失败。 应用程序可能正在访问当前活动任务不拥有的套接字 (,即尝试在) 的任务之间共享套接字,或者 调用 WSACleanup 的次数太多。
WSAEDISCON
10101
正在进行正常关闭。
WSARecvWSARecvFrom 返回,以指示远程方已启动正常关闭序列。
WSAENOMORE
10102
没有更多结果。
WSALookupServiceNext 函数不能返回更多结果。
WSAECANCELLED
10103
呼叫已取消。
调用 WSALookupServiceEnd 函数时,此调用仍在处理中。 呼叫已取消。
WSAEINVALIDPROCTABLE
10104
过程调用表无效。
服务提供商过程调用表无效。 服务提供商向Ws2_32.dll返回了一个虚假的过程表。 这通常是由一个或多个函数指针为 NULL 引起的。
WSAEINVALIDPROVIDER
10105
服务提供商无效。
请求的服务提供程序无效。 如果找不到指定的协议条目, 则 WSCGetProviderInfoWSCGetProviderInfo32 函数将返回此错误。 如果服务提供商返回的版本号不是 2.0,也会返回此错误。
WSAEPROVIDERFAILEDINIT
10106
服务提供程序初始化失败。
无法加载或初始化请求的服务提供程序。 如果无法加载服务提供程序的 DLL, (LoadLibrary) 失败,或者提供程序的 WSPStartupNSPStartup 函数失败,则返回此错误。
WSASYSCALLFAILURE
10107
系统调用失败。
不应失败的系统调用失败。 这是在各种条件下返回的一般错误代码。
当不应失败的系统调用失败时返回。 例如,如果对 WaitForMultipleEvents 的 调用失败,或者其中一个注册表函数无法尝试操作协议/命名空间目录。
当提供程序不返回 SUCCESS 且不提供扩展错误代码时返回。 可以指示服务提供程序实现错误。
WSASERVICE_NOT_FOUND
10108
找不到服务。
没有此类服务是已知的。 在指定的名称空间中找不到该服务。
WSATYPE_NOT_FOUND
10109
找不到类类型。
未找到指定的类。
WSA_E_NO_MORE
10110
没有更多结果。
WSALookupServiceNext 函数无法返回更多结果。
WSA_E_CANCELLED
10111
呼叫已取消。
调用 WSALookupServiceEnd 函数时,此调用仍在处理中。 呼叫已取消。
WSAEREFUSED
10112
数据库查询被拒绝。
数据库查询失败,因为它被主动拒绝。
WSAHOST_NOT_FOUND
11001
找不到主机。
无法识别这种主机。 该名称不是正式的主机名或别名,或者在查询) (数据库中找不到它。 对于协议和服务查询,也可能返回此错误,这意味着无法在相关数据库中找到指定的名称。
WSATRY_AGAIN
11002
找不到非授权主机。
这通常是主机名解析期间的临时错误,表示本地服务器未收到来自权威服务器的响应。 在稍后的某个时间进行的重试可能成功。
WSANO_RECOVERY
11003
这是一个不可恢复的错误。
这表示在数据库查找期间发生了某种不可恢复的错误。 这可能是因为数据库文件 (例如,找不到与 BSD 兼容的 HOSTS、SERVICES 或 PROTOCOLS 文件) ,或者服务器返回了 DNS 请求并出现严重错误。
WSANO_DATA
11004
有效名称,没有请求类型的数据记录。
请求的名称有效且已在数据库中找到,但它没有为其解析的正确关联数据。 通常的示例是使用 gethostbynameWSAAsyncGetHostByName () 尝试使用 DNS (域名服务器) 的主机名到地址转换尝试。 返回 MX 记录,但没有 A 记录,指示主机本身存在,但不可直接访问。
WSA_QOS_RECEIVERS
11005
QoS 接收器。
至少有一个 QoS 储备已到达。
WSA_QOS_SENDERS
11006
QoS 发送方。
已到达至少一个 QoS 发送路径。
WSA_QOS_NO_SENDERS
11007
没有 QoS 发送方。
没有 QoS 发送方。
WSA_QOS_NO_RECEIVERS
11008
QoS 无接收方。
没有 QoS 接收器。
WSA_QOS_REQUEST_CONFIRMED
11009
已确认 QoS 请求。
已确认 QoS 保留请求。
WSA_QOS_ADMISSION_FAILURE
11010
QoS 允许错误。
由于缺少资源,发生 QoS 错误。
WSA_QOS_POLICY_FAILURE
11011
QoS 策略失败。
QoS 请求被拒绝,因为策略系统无法在现有策略中分配请求的资源。
WSA_QOS_BAD_STYLE
11012
QoS 样式错误。
遇到未知或冲突的 QoS 样式。
WSA_QOS_BAD_OBJECT
11013
QoS 错误对象。
通常,filterspec 或提供程序特定的缓冲区的某个部分遇到问题。
WSA_QOS_TRAFFIC_CTRL_ERROR
11014
QoS 流量控制错误。
基础流量控制 (TC) API 错误,因为通用 QoS 请求已由 TC API 转换为本地强制实施。 这可能是由于内存不足错误或内部 QoS 提供程序错误造成的。
WSA_QOS_GENERIC_ERROR
11015
QoS 一般错误。
常规 QoS 错误。
WSA_QOS_ESERVICETYPE
11016
QoS 服务类型错误。
在 QoS 流spec 中发现无效或无法识别的服务类型。
WSA_QOS_EFLOWSPEC
11017
QoS 流spec 错误。
在 QOS 结构中发现无效或不一致的 flowspec。
WSA_QOS_EPROVSPECBUF
11018
无效的 QoS 提供程序缓冲区。
特定于 QoS 提供程序的缓冲区无效。
WSA_QOS_EFILTERSTYLE
11019
QoS 筛选器样式无效。
使用了无效的 QoS 筛选器样式。
WSA_QOS_EFILTERTYPE
11020
QoS 筛选器类型无效。
使用了无效的 QoS 筛选器类型。
WSA_QOS_EFILTERCOUNT
11021
QoS 筛选器计数不正确。
在 FLOWDESCRIPTOR 中指定了不正确数量的 QoS 筛选器PECS。
WSA_QOS_EOBJLENGTH
11022
QoS 对象长度无效。
在特定于 QoS 提供程序的缓冲区中指定了具有无效 ObjectLength 字段的对象。
WSA_QOS_EFLOWCOUNT
11023
QoS 流计数不正确。
在 QoS 结构中指定了错误数量的流描述符。
WSA_QOS_EUNKOWNPSOBJ
11024
无法识别的 QoS 对象。
在特定于 QoS 提供程序的缓冲区中找到无法识别的对象。
WSA_QOS_EPOLICYOBJ
11025
QoS 策略对象无效。
在特定于 QoS 提供程序的缓冲区中找到无效的策略对象。
WSA_QOS_EFLOWDESC
11026
QoS 流描述符无效。
在流描述符列表中发现了无效的 QoS 流描述符。
WSA_QOS_EPSFLOWSPEC
11027
特定于 QoS 提供程序的流spec 无效。
在特定于 QoS 提供程序的缓冲区中发现了无效或不一致的 flowspec。
WSA_QOS_EPSFILTERSPEC
11028
QoS 提供程序特定的筛选器规格无效。
在特定于 QoS 提供程序的缓冲区中发现无效的 FILTERSPEC。
WSA_QOS_ESDMODEOBJ
11029
无效的 QoS 形状放弃模式对象。
在特定于 QoS 提供程序的缓冲区中发现了无效的形状放弃模式对象。
WSA_QOS_ESHAPERATEOBJ
11030
无效的 QoS 整形速率对象。
在特定于 QoS 提供程序的缓冲区中发现了无效的定形速率对象。
WSA_QOS_RESERVED_PETYPE
11031
保留策略 QoS 元素类型。
在特定于 QoS 提供程序的缓冲区中找到保留的策略元素。

 

要求

要求
标头
Winsock2.h;
Winerror.h

另请参阅

错误代码 - errno、h_errno 和 WSAGetLastError

处理 Winsock 错误

FormatMessage

WSAGetLastError