大多数 Windows 套接字 2 函数在函数返回时不返回错误的具体原因。 有关信息,请参阅
处理 Winsock 错误
主题。
WSAGetLastError
函数返回调用线程发生的最后一个错误。 当特定的 Windows 套接字函数指示发生了错误时,应立即调用此函数以检索失败的函数调用的扩展错误代码。 这些错误代码和与错误代码关联的短文本说明在
Winerror.h
头文件中定义。
FormatMessage
函数可用于获取返回错误的消息字符串。
有关如何在将套接字应用程序移植到 Winsock 时处理错误代码的信息,请参阅
错误代码 - errno、h_errno 和 WSAGetLastError
。
以下列表描述了
WSAGetLastError
函数返回的可能错误代码。 错误按数字顺序列出,并带有错误宏名称。
Winsock2.h
头文件中定义的某些错误代码不会从任何函数返回。
返回代码/值
-
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 上的套接字操作。
-
尝试对不是套接字的内容执行操作。 套接字句柄参数未引用有效的套接字,或者对于
select
,
fd_set
的成员无效。
-
WSAEDESTADDRREQ
-
10039
-
需要目标地址。
-
套接字上的操作中省略了所需的地址。 例如,如果使用远程地址ADDR_ANY调用
sendto
,则返回此错误。
-
WSAEMSGSIZE
-
10040
-
消息太长。
-
在数据报套接字上发送的消息大于内部消息缓冲区或其他网络限制,或者用于接收数据报的缓冲区小于数据报本身。
-
WSAEPROTOTYPE
-
10041
-
套接字的协议类型错误。
-
在
套接字
函数调用中指定了不支持所请求的套接字类型的语义的协议。 例如,不能使用套接字类型指定 ARPA Internet UDP 协议SOCK_STREAM。
-
WSAENOPROTOOPT
-
10042
-
协议选项错误。
-
在
getsockopt
或
setsockopt
调用中指定了未知、无效或不支持的选项或级别。
-
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 错误可能会延迟到提交特定地址。 稍后调用另一个函数(包括
connect
、
listen
、
WSAConnect
或
WSAJoinLeaf)
可能会发生这种情况。
-
WSAEADDRNOTAVAIL
-
10049
-
无法分配请求的地址。
-
请求的地址在其上下文中无效。 这通常是由于尝试
绑定到
对本地计算机无效的地址。 当远程地址或端口对远程计算机无效时,也可能导致
连接
、
sendto
、
WSAConnect
、
WSAConnect、WSAJoinLeaf
或
WSASendTo
, (地址或端口 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。
-
应用程序未调用
WSAStartup
或
WSAStartup
失败。 应用程序可能正在访问当前活动任务不拥有的套接字 (,即尝试在) 的任务之间共享套接字,或者
调用 WSACleanup
的次数太多。
-
WSAEDISCON
-
10101
-
正在进行正常关闭。
-
由
WSARecv
和
WSARecvFrom
返回,以指示远程方已启动正常关闭序列。
-
WSAENOMORE
-
10102
-
没有更多结果。
-
WSALookupServiceNext
函数不能返回更多结果。
-
WSAECANCELLED
-
10103
-
呼叫已取消。
-
调用
WSALookupServiceEnd
函数时,此调用仍在处理中。 呼叫已取消。
-
WSAEINVALIDPROCTABLE
-
10104
-
过程调用表无效。
-
服务提供商过程调用表无效。 服务提供商向Ws2_32.dll返回了一个虚假的过程表。 这通常是由一个或多个函数指针为
NULL
引起的。
-
WSAEINVALIDPROVIDER
-
10105
-
服务提供商无效。
-
请求的服务提供程序无效。 如果找不到指定的协议条目,
则 WSCGetProviderInfo
和
WSCGetProviderInfo32
函数将返回此错误。 如果服务提供商返回的版本号不是 2.0,也会返回此错误。
-
WSAEPROVIDERFAILEDINIT
-
10106
-
服务提供程序初始化失败。
-
无法加载或初始化请求的服务提供程序。 如果无法加载服务提供程序的 DLL, (
LoadLibrary
) 失败,或者提供程序的
WSPStartup
或
NSPStartup
函数失败,则返回此错误。
-
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
-
有效名称,没有请求类型的数据记录。
-
请求的名称有效且已在数据库中找到,但它没有为其解析的正确关联数据。 通常的示例是使用
gethostbyname
或
WSAAsyncGetHostByName
() 尝试使用 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 提供程序的缓冲区中找到保留的策略元素。