windowssocket错误码及出错原因

windows socket错误码及出错原因

编程 2009-11-01 14:33:21 阅读1890 评论0 字号:大中小 订阅 本文转自http://blog.csdn.net/khler/archive/2007/07/11/1685023.aspx

Windows Sockets在头文件winsock.h中定义了所有的错误码,它们包括以“WSA”打头的Windows Sockets实现返回的错误码和Berkeley Sockets定义的错误码全集。定义Berkeley Sockets错误码是为了确保原有软件的可移植性。 A.1 Windows Sockets错误码列表

表A.1列出了WSAGetLastError()函数返回的可能错误码和它们的解释,它们可分为四个部分。

错误码的第一部分是用来解决在不同的C编译中对标准C错误码的不一致的定义。错误码的第二部分是标准Berkeley Sockets错误码的Windows Sockets版本。错误码的第三部分包括特定Windows Sockets扩充的错误码。错误码的第四部分由Windows Sockets的getXbyY()和WSAAsyncGetXByY()函数返回,相当于Berkeley软件中由变量h_errno返回的错误(事实上,Windows Sockets在头文件winsock.h中已将h_error定义成其值为WSAGetLastError()的一个宏),它们相当于由域名服务(Domain Name Service)返回的各种失败。如果Windows Sockets实现没有使用域名服务,它将使用最合适的代码。一般地,Windows Sockets应用程序应该将错误WSAHOST_NOT_FOUND和WSANO_DATA解释为指示关键字(名字,地址等)没有找着,而错误 WSATRY_AGAIN和WSANO_RECOVERY是提醒名字服务自身是非操作的。

错误码由Windows Sockets 规范定义,在所有同一版本规范的Windows Sockets兼容实现中,它们是一致的。

表A.1 Windows Sockets错误码 Windows Sockets错误码 WSAEINTR WSAEBADF WSAEACCES WSAEFAULT WSAEINVAL WSAEMFILE WSAEWOULDBLOCK WSAEINPROGRESS Berkeley 对应错误码 错误号 解 释 EINTR EBADF EACCES EFAULT EINVAL EMFILE EWOULDBLOCK EINPROGRESS 10004 同标准C 10009 同标准C 10013 同标准C 10014 同标准C 10022 同标准C 10024 同标准C 10035 同BSD 10036 当一个阻塞函数正在进行时,调用任何Windows Sockets API函数均返回此错误 10037 同BSD 10038 同BSD 10039 同BSD 10040 同BSD 10041 同BSD 10042 同BSD WSAEALREADY WSAENOTSOCK WSAEDESTADDRREQ WSAEMSGSIZE WSAEPROTOTYPE WSAENOPROTOOPT EALREADY ENOTSOCK EDESTADDRREQ EMSGSIZE EPROTOTYPE ENOPROTOOPT WSAEPROTONOSUPPORT EPROTONOSUPPORT 10043 同BSD WSAESOCKTNOSUPPORT ESOCKTNOSUPPORT 10044 同BSD WSAEOPNOTSUPP WSAEPFNOSUPPORT WSAEAFNOSUPPORT WSAEADDRINUSE WSAEADDRNOTAVAIL WSAENETDOWN EOPNOTSUPP EPFNOSUPPORT EAFNOSUPPORT EADDRINUSE EADDRNOTAVAIL ENETDOWN 10045 同BSD 10046 同BSD 10047 同BSD 10048 同BSD 10049 同BSD 10050 同BSD。任何时候只要Windows Sockets实现检测到网络子系统失败,它就报告此错误。 10051 同BSD 10052 同BSD 10053 同BSD 10054 同BSD 10055 同BSD 10056 同BSD 10057 同BSD 10058 同BSD 10059 同BSD 10060 同BSD 10061 同BSD 10062 同BSD 10063 同BSD 10064 同BSD 10065 同BSD 10091 由WSAStartup() 返回,指示网络子系统无法使用。 10092 由WSAStartup() 返回,指示Windows Sockets DLL 不能支持此应用程序。 10093 由除WSAStartup()之外的其它函数返回,指示 尚没有一次成功的WSAStartup() 调用执行过。 10101 由WSARecv()和WSARecvFrom()返回,指示远程方已经初始化了一个“雅致”的shutdown序列。 11002 同BSD 11003 同BSD 11004 同BSD WSAENETUNREACH WSAENETRESET WSAECONNABORTED WSAECONNRESET WSAENOBUFS WSAEISCONN WSAENOTCONN WSAESHUTDOWN WSAETOOMANYREFS WSAETIMEDOUT WSAECONNREFUSED WSAELOOP WSAENAMETOOLONG WSAEHOSTDOWN WSAEHOSTUNREACH WSASYSNOTREADY ENETUNREACH ENETRESET ECONNABORTED ECONNRESET ENOBUFS EISCONN ENOTCONN ESHUTDOWN ETOOMANYREFS ETIMEDOUT ECONNREFUSED ELOOP ENAMETOOLONG EHOSTDOWN EHOSTUNREACH WSAVERNOTSUPPORTED WSANOTINITIALISED WSAEDISCON WSAHOST_NOT_FOUND HOST_NOT_FOUND 11001 同BSD WSATRY_AGAIN WSANO_RECOVERY WSANO_DATA TRY_AGAIN NO_RECOVERY NO_DATA A.2 Windows Sockets错误码扩展描述

下面给出WSAGetLastError()函数返回的可能错误码按字母顺序排列的列表,同时给出简要的扩展描述。

WSAEACCES (10013) Permission denied.

试图使用被禁止的访问权限去访问套接字。例如,在没有使用函数setsockopt()的SO_BROADCAST命令设置广播权限的套接字上使用函数sendto()给一个广播地址发送数据。

WSAEADDRINUSE (10048) Address already in use.

正常情况下每一个套接字地址(协议/IP地址/端口号)只允许使用一次。当应用程序试图使用bind()函数将一个被已存在的或没有完全关闭的或正在关闭的套接字使用了的IP地址/端口号绑扎到一个新套接字上时,该错误发生。对于服务器应用程序来说,如果需要使用bind()函数将多个套接字绑扎到同一个端口上,可以考虑使用setsockopt()函数的SO_REUSEADDR命令。客户应用程序一般不必使用bind()函数—— connect()函数总是自动选择没有使用的端口号。当bind()函数操作的是通配地址(包括ADDR_ANY)时,错误WSAEADDRINUSE 可能延迟到一个明确的地址被提交时才发生。这可能在后续的函数如connect()、listen()、WSAConnect()或 WSAJoinLeaf()调用时发生。

WSAEADDRNOTAVAIL (10049) Cannot assign requested address.

被请求的地址在它的环境中是不合法的。通常地在bind()函数试图将一个本地机器不合法的地址绑扎到套接字时产生。它也可能在 connect()、sendto()、WSAConnect()、WSAJoinLeaf()或WSASendTo()函数调用时因远程机器的远程地址或端口号非法(如0地址或0端口号)而产生。

WSAEAFNOSUPPORT (10047) Address family not supported by protocol family.

使用的地址与被请求的协议不兼容。所有的套接字在创建时都与一个地址族(如IP协议对应的AF_INET)和一个通用的协议类型(如 SOCK_STREAM)联系起来。如果在socket()调用中明确地要求一个不正确的协议,或在调用sendto()等函数时使用了对套接字来说是错误的地址族的地址,该错误返回。

WSAEALREADY (10037) Operation already in progress. 当在非阻塞套接字上已经有一个操作正在进行时,又有一个操作试图在其上执行则产生此错误。如:在一个正在进行连接的非阻塞套接字上第二次调用connect()函数;或取消一个已经被取消或已完成的异步请求(WSAAsyncGetXbyY())。

WSAECONNABORTED (10053) Software caused connection abort.

一个已建立的连接被你的主机上的软件终止,可能是因为一次数据传输超时或是协议错误。

WSAECONNREFUSED (10061) Connection refused. 因为目标主机主动拒绝,连接不能建立。这通常是因为试图连接到一个远程主机上不活动的服务,如没有服务器应用程序处于执行状态。

WSAECONNRESET (10054) Connection reset by peer.

存在的连接被远程主机强制关闭。通常原因为:远程主机上对等方应用程序突然停止运行,

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4