常见socket错误返回码.docx

上传人:b****5 文档编号:6488790 上传时间:2023-01-07 格式:DOCX 页数:6 大小:23.10KB
下载 相关 举报
常见socket错误返回码.docx_第1页
第1页 / 共6页
常见socket错误返回码.docx_第2页
第2页 / 共6页
常见socket错误返回码.docx_第3页
第3页 / 共6页
常见socket错误返回码.docx_第4页
第4页 / 共6页
常见socket错误返回码.docx_第5页
第5页 / 共6页
点击查看更多>>
下载资源
资源描述

常见socket错误返回码.docx

《常见socket错误返回码.docx》由会员分享,可在线阅读,更多相关《常见socket错误返回码.docx(6页珍藏版)》请在冰豆网上搜索。

常见socket错误返回码.docx

常见socket错误返回码

常见SOCKET错误返回码(转)WSAEINTR(10004)被中断的系统呼唤当以阻拦式进行的WinSock函式被WSACancelBlockingCall()中断的时候,那个阻拦式函式会取得WSAEINTR那个错误讯息。

读者要注意的是,当你的程式有效WSACancelBlockingCall去中断阻拦式函式的时候,你必需为那个阻拦式函式写处置WSAEINTR错误讯息的程式码,不然你的程式可能会显现些无预期的错误。

原那么上,所有能以阻拦式进行的函式都可能会发生那个错误。

WSAEBADF(10009)错误的档案代码柏克莱socket介面中,档案描述子和socket描述子是相通的,开启socket能够想像成开启一个档案。

WSAEBADF在柏克莱socket介面的意义是指错误的socket描述子,那个错误的socket描述子可能是未经开启的socket或是以关闭的socket。

在WinSock中有个相通的错误代码WSAENOTSOCK,用来指定错误的socket描述子。

详细说明请参考WSAENOTSOCK部份。

WSAEACCES(10013)无此权限关于柏克莱socket介面函式,那个错误发生的缘故一般是开启一个不具有开启权限的档案或socket。

例如在UNIX上,一样的利用者不能开启SOCK_RAW的socket,一般是超级利用者(superuser)才有此权限。

若是一样的利用者企图开启SOCK_RAW的socket,将会取得那个错误讯息。

关于WinSockAPI函式介面,发生此错误的函式有二:

send()和sendto()。

当利用send()或sendto()传送资料的时候,将目的位址设成广播位址(broadcastaddress),可是并未呼唤setsockopt()设定SO_BROADCAST选项时便会发生WSAEACCES错误。

WSAEFAULT(10014)错误的经历体位址系统侦测出利用错误的经历体位址。

呼唤WinSock函式时,常常会有参数是以指标的方式传入,那个指标可能是指向一个结构,如sockaddr_in结构,或是指向一个资料缓冲区。

当程式不警惕传入一个错误经历体未指的指标时,就会发生WSAEFAULT那个错误。

另外,当指标所指向的经历体区块过小的时候,也会发生那个错误。

WSAEINVAL(10022)参数错误若是传入不正确的参数给WinSock函式的话,会致使WSAEINVAL那个错误。

若是参数是一个结构的指标,此结构内容填入不正确的值,也会致使那个错误。

例如,shutdown()函式的how()参数只能是0、1或2,假设是设定成其他数值,就会显现那个错误。

在网路程式的设计中,函式和函式之间的呼唤通常有必然的顺序,如过不照那个顺序进行,也会显现那个错误。

底下是针对每一个相关函式的详细说明。

函式错误发生的机会accept()呼唤accept()之前没有成功呼唤listen()bind()已经成功呼唤bind()函式而指定stocket的名称了getstockname()没有呼唤bind()函式指定socket名称listen()已经处于连接状态或是socket没有呼唤bind()函式指定socket名称recv()和recvfrom()关于datagramsocket,socket没有呼唤bind()函式指定IP位址、port和协定等;关于streamsocket,连接尚未成立send()和sendto()关于datagramsocket,socket没有呼唤bind()函式指定IP位址、port和协定等;关于streamsocket,连接尚未成立原那么上,所有函式其参数所能设定的值有必然的范围,或是有一些特定的值,这些函式都有可能发生那个错误。

WSAEMFILE(10024)太多开启的档案柏克莱socket介面的说明是开启过量的档案,超过档案开启数的限制。

在柏克莱socket将档案和socket的开启以档案描述子(filedescriptor)描述。

WinSock关于socket是有别于档案的,WSAEMFILE在WinSock的意义是开启太多的socket。

那个程式通常发生在同一部机械中执行过量的网路程式,以致开启过量的socket。

另一种能够幸免的错误是应用程式没有正常的关闭不用的socket,以致socket资源耗尽。

WSAEWOULDBLOCK(10035)函式作用阻拦中当函式作用是以非阻拦式进行,而此刻的函式作用再返回时其函式作用尚未完成的时候,就会显现那个错误。

举例来讲,假设send()以非阻拦式传送一段资料至远端主机,假设函式返回时取得WSAEWOULDBLOCK那个错误,如此表示这一段资料不能在这一次的send()函式呼唤中传送完。

关于connect()函式,那个错误表示尚未成功地连接上远端主机,连接要求正在进行中。

假设你的程式中有利用setsockopt()函式以SO_LINGER设按时限,在呼唤closesocket()时有可能显现那个错误。

关于非同步的网路资料函式(WSAAsyncGetXXXXByYYYY())而言,取得WSAEWOULDBLOCK错误,表示要查询的网路资料目前无法取得。

这一般是个临时性的错误,应用程式可能稍后再呼唤相同的函式就会成功。

WSAEINPROGRESS(10036)有阻拦函式正在执行中关于每一个process或thread,WinSock只许诺”一”个阻拦式函式的执行。

若是已有阻拦式函式正在执行,而又呼唤到WinSock函式,函式会传回WSAEINPROGRESS的错误。

那个错误也会发生在需要长执行时刻的函式,如connect()。

有一种情形是如此:

当执行”非阻拦式”的connect()函式两次,由于是非阻拦式的connect(),第一次的呼唤传回WSAEWOULDBLOCK错误码。

现在要求连接动作尚未完成,第二次的connect()呼唤就会取得WSAEINPROGRESS的错误。

咱们的建议是在有可能发生这种错误的函式呼唤前加上WSAIsBlocking()判定是不是有阻拦式函式正在执行。

若是有的话,咱们可能需要将正在进行的阻拦式函式取消掉,或是将目前想要做的事取消掉。

WSAEALREADY(10037)函式作用已完成那个错误的意思在柏克莱socket介面和WinSock函式的说明上有专门大的不同。

柏克莱socket介面的说明是函式作用已完成;在WinSock中,WSAEALREADY的意思是:

”你想要取消的非同步事件已经被取消了!

”,也确实是当你呼唤WSACancelAsyncRequest()试图去取消一个非同步事件时,而该事件已被取消了。

WSAENOTSOCK(10038)非法的socket通常WinSock函式都要以socket描述子当参数传入,若是那个socket描述子所代表的socket不是正确开启的或是全然没有开启,函式就会取得WSAENOTSOCK错误。

原那么上,只要以socket描述子当参数传入的函式都有发生WSAENOSOCK错误的可能。

WSAEDESTADDRREQ(10039)需要对方位址当你要传送资料给远端机械,必需指定对方的位址(和port等等),才能正确送达。

检查看看你的应用程式是不是在呼唤connect()或sendto()时,正确地填入对方的sockaddr结构。

WSAEMSGSIZE(10040)讯息太长,缓冲区无法容纳那个错误发生缘故是由于讯息资料过大,缓冲区无法容纳,那个地址的缓冲区可能是利用者指定的或是系统内部用的缓冲区。

会发生那个错误的函式有四:

函式错误发生的机会recv()、recvform()利用datagramsocket接收资料时,若是recv()、recvform()指定的缓冲区长度小于接收进来datagram,这时后太长的datagram会被抛弃并告知函式WSAEMSGSIZE那个错误send()、sendto()利用datagramsocket传送资料时,若是送出的资料缓冲区大于WinSock所能传递datagram的最大长度,这时send()和sendto()传回发生WSAEMSGSIZ那个错误讯息WSAEPROTOTYPE(10041)错误的协定型别错误产生的缘故是在socket()函式呼唤时指定了WinSock不支援的协定举例来讲,你不能够在steamsocket(SOCK_STREAM)设定以UDP协定传输(IPPRO_UDP)。

streamsocket并非支援UDP通信协定。

若是你真的有心去测试的话,程式中故意如此呼唤socket():

hSock=socket(AF_INET,SOCK_STREAM,IPPROTO_UDP);你会发觉,如此的socket()函式呼唤会取得WSAEPROTONOSUPPORT错误。

这显然不对,照理应该取得WSAEPROTOTYPE那个错误才对。

WSAEPROTOTYPE那个错误表示指定了错误的协定,而所指定的协定是该位址家族(协定家族)所支援的,但不适用于socket型别。

以上述的例子来看,UDP协定是属于AF_INET那个位址家族,可是并非能用于streamsocket(SOCK_STREAMsocket)上。

WSAEPROTONOSUPPORT那个错误表示所指定的协定是该协定家族所不支援的,意思上和WSAEPROTOTYPE有点出入。

事实上,WSAEPROTOTYPE和WSAEPROTONOSUPPORT之间的不同是微乎其微的。

在进展网路程式的时候,这两种错误都是代表着同一种状况--协定指定错误。

总之,你永久也没方法试出WSAEPROTOTYPE那个错误。

WSAENOPROTOOPT(10042)错误的协定选项(option)那个错误主若是针对getsockopt()和setsockopt()函式的。

这两个函式能够以参数设定不同的选项而有不同的作用。

关于每一个选项多多少少会有些限制,如有些选项只能用在streamsocket,而有些只能用在datagramsocket。

若是违背这些限制,就会发生那个错误。

请看下表:

SO_DONTLINGERSO_KEEPALIVESO_LINGERSO_OOBINLINETCP_NODELAYdatagramsocket(SOCK_DGRAM)不支援这些选项SO_DEBUGSO_DONTROUTESO_RCVBUFSO_SNDBUFTCP_NODELAY有些厂商的WinSockTCP/IP协定核心不支援这些选项SO_ACCEPTCONNSO_ERRORSO_TYPE这些选项只适用于getsockopt()函式,不能作用于setsockopt()函式WSAEPROTONOSUPPORT(10043)不支援的协定WinSock协定核心不支援所指定的通信协定。

举例来讲当你用socket()函式时,第二个参数指定为SOCK_STREAM,第三个参数指定为IPPROTO_ICMP,如此socket()呼唤会取得WSAEPROTONOSUPPORT那个错误。

WinSock1。

1版并非支援ICMP协定,因此呼唤socket()指定ICMP那个协定,就会发生错误。

事实上,产生WSAEPROTONPSUPPORT错误的状况不只如此,详见WSAEPROTOTYPE。

WSAESOCKTNOSUPPORT(10044)不支援的socket型别目前利用的WinSock版本不支援函式所指定的socket型别。

举例来讲,完全依照WinSock版的规格书进展的WinSock协定核心,并非支援SOCK_RAW那个socket型别。

在呼唤socket()函式时,位址家族选AF_INET(PF_INET)而socket型别选SOCK_RAW的话,就会发生那个错误。

有些厂商进展的WinSock协定核心除支援WinSock版的规格书所标准之外,还提供许多不同的功能。

咱们建议您在进展程式时,若是有必要用到这些额外的功能,请好好考虑一下和其他环境相容性的问题。

WSAEOPNOTSUPP(10045)作用函式不支援此类socket函式作用不支援目前socket型别。

举例来讲,accept()和listen()函式只能作用在连接导向的socket(streamsocket),也确实是streamsocket上。

关于recv()、recvform()、send()和sendto()函式,MSG_OOB也是只能用于连接导向的socket。

WSAEPFNOSUPPORT(10046)不支援的协定家族目前的WinSock协定核心不支援所指定的协定家族。

那个错误和WSAEAFNOSUPPORT很像,目前那个错误被WSAEAFNOSUPPORT所取代了,读者能够参考WSAEAFNOSUPPORT说明部份。

WSAEAFNOSUPPORT(10047)不支援的位址家族利用协定不支援指定的位址家族。

关于socket()函式,错误发生缘故是函式转物错误的参数。

关于以sockaddr结构为参数的函数,错误发生的缘故常是网路协定不支援sockaddr结构中(sin_family成员)指定的位址家族。

WSAEADDRINUSE(10048)位址已被指定了所指定的”位址”正在利用中。

那个地址的位址是指socket的名称,包括三部份:

协定、port和IP位址。

那个错误发生的缘故一般是应用程式试取利用bind()函式去指定port时,此port已被其他应用程式所占用了。

这种情形发生于在同一部主机上执行两个相同性质(指定相同socket名称)的server程式,第二的程式会因为第一个程式先占用某个port而取得此错误讯息。

还有一种常见的情形确实是在撰写client程式时,利用bind()去指定socket的port,此举常会有那个错误发生。

并非不能用bind()去指定socket的port,而是你无法确信程式执行的时候,所指定的port是不是有其他程式正在利用。

通常很少会在client程式中呼唤bind()函式,一样的client程式都是让系统帮你选一个适当的port。

另外,应用程式能够利用setsockopt()的SO_REUSEADDR选项,许诺port能够重复利用,可是咱们并非鼓舞如此做。

如此可能会造成TCP/IP核心在判定应用程式上的困扰。

WSAEADDRNOTAVAIL(10049)无法指定位址错误发生的缘故一般是指定了该部机械不该该有的位址。

那个地址的位址包括三个部份:

网路协定、port和IP位址。

在柏克莱socket介面中,呼唤bind()时,假设指定的IP位址不是本地机械该有的位址,就会显现那个错误。

在呼唤connect()或sendto()函式时,若是sockaddr_in结构中的sin_port填”0”,如此也会致使那个错误(在UNXI上是EADDRNOTAVAIL错误)。

关于WinSock函式,错误发生的机会和柏克莱socket函式类似,bind()和connect()都会致使如此的错误。

关于WinSock函式,错误发生的机会和柏克莱socket函式类似,bind()和connect()都会致使如此的错误。

WinSock版的规格书中并无提到bind()函式会致使WSAEADDRNOTAVAIL错误,只是依照咱们测试的结果,bind()也会致使如此的错误。

 WSAENETDOWN(10050)网路犯错基层的网路系统发生问题,WinSock函式无法执行。

这是一个相当严峻的问题,这会使得几乎所有的WinSock函式呼唤失败。

假设你的WinSock函式发生错误,那么请你该好好地检查你的网路卡,网路卡驱动程式和你的WinSock协定核心。

WSAENETUNREACH(10051)无法连上指定的网路在柏克莱socket介面中,那个错误的意思是无法和对方网路系统取得联系。

在WinSock1。

1规格中,WSAENETUNREACH相通于柏克莱socket介面中的ETHOSTUNREACH。

WSAENETRESET(10052)网路已被从头设定对方主机犯错而从头开机。

在本地主机呼唤和传送资料有关的函式就会取得那个错误。

关于setsockopt()函式,那个错误发生的缘故在于试图设定SO_KEEPALIVE于逾时(timeout)的连接。

WSAECONNABORTED(10053)中断连接在连接成立后,当有某种缘故致使TCP/IP协定核心不断地重送资料,而且都重送失败的时候,TCP/IP协定将连接中断。

现在,应用程式就会收到WSACONNABORTED那个错误。

WSAECONNRESET(10054)连结已被对方从头设定连结已被对方系统强迫中断了。

TCP/IP协定核心若是侦测出streamsocket的连接发生问题的话,它会传一个表示连接重设(reset)的讯息给对方。

现在对方程式会取得WSAECONNRESET的错误讯息。

WSAENOBUFS(10055)缓冲区过小WinSock核心无法配置足够的缓冲区,无法执行该程式。

那个错误的发生和整个Windows系统资源有关。

若是整个Windows本身可用的资源就很少,所能同时执行的程式也少。

也有可能是执行了"不良"的应用程式,没有正常的利用和归还系统资源(如经历体)。

或是某些应用程式的不正常关闭,也会占用系统资源。

WSAEISCONN(10056)socket已经连接网路函式通常会有必然的呼唤顺序,有的函式呼唤成功后便不能再呼唤,不然会显现错误。

当连接成立时,client程式呼唤()成功,而server程式呼唤accept()成功。

现在假设client程式再呼唤一次connect()函式的话,会取得WSAEISCONN那个错误,表示该socket已经处于连接状态了。

若是client程式呼唤listen()函式的话也会显现那个错误,表示不该该在现在呼唤那个函式。

关于server程式,若是socket已经处于连接状态,程式呼唤connect()函式的话,也会取得WSAEISCONN那个错误。

上述错误是发生在streamsocket上,因为streamsocket才会成立连接。

关于datagramsocket,多次成功的connect()函式呼唤是被许诺的(关于datdgramsocket而言,呼唤connect()函式的目的不在于成立连接)。

datagramsocket发生此错误的缘故是在sendto()函式上,当呼唤sendto()传送datagram时,若是对方位址填入INADDR_ANY(“而port填入0(在sockaddr_in结构中),就会致使WSAEISCONN那个错误。

WSAENOTCONN(10057)socket尚未连接网路函式通常会有必然的呼唤顺序,有些函式必需先呼唤成功某函式才能呼唤。

WSAENOTCONN那个错误发生的缘故很明显,确实是在连接成立之前,你试图从连接对方取得资料或是传送资料到对方,就会发生WSAENETCONN那个错误。

举例来讲,关于streamsocket,若是在成立连结前呼唤send()试图传送资料,或是呼唤recv()试图取得资料,就会发生那个错误,告知你socket尚未成立连接。

你若是呼唤了getpeername()那个函式试图去取得连接对方的socket,固然也会显现那个错误。

关于setsockopt()那个函式,若是设定SO_KEEPALIVE,但连接已被中断的话,也会显现WSAENETCONN那个错误。

初学者可能在呼唤connect()函式以后没有检查是不是函式呼唤错误,以致不明白是不是连接已正确成立。

WSAESHUTDOWN(10058)socket已经关闭那个错误码的意思是,无法再传送资料了,因为socket已经经由shutdown()函式而关闭了。

当你利用shutdown()关闭socket以后,WinSock的TCP/IP协定核心就会关闭那个socket的传送或接收的功能。

有一点要注意的是,那个错误只会在streamsocket显现。

WSAETOOMANYREFS(10059)参照(reference)太多,资源耗尽在UNIX作业系统中的说明是指系统核心资源消耗殆尽。

只是在WinSock版的规格书中并无任何一个函式会发生这种错误。

WSAETIMEDOUT(10060)连接逾时(timeout)当程式试取利用connect()连接一台远端主机时,此主机一直没有回应,通过了一段时刻后,TCP/IP协定核心便会传回connect()函式WSAETIMEDOUT那个错误讯息。

发生那个错误的缘故可能是程式所要连接的远端主机的系统发生问题,或全然没有这一台主机。

也有一种可能的缘故是本地机械的网路系统显现问题,致使本地主机无法正常与远端主机联系。

检查你的网路系统的设定,看看有什么不妥的地址,如闸道器(gateway)的设定,主机名称表(hosts)内主机名称和网路位址的对照有错误等等。

WSAECONNREFUSED(10061)连同意拒连接要求受到对方机械的拒绝,无法和对方成立连接。

那个错误并非是网路系统出了问题,而是对方机械的server程式拒绝client程式的连接要求,或是全然没有那个server程式存在。

当TCP/IP核心收到某个连接要求时,会查看系统中是不是有某server程式所监听的port正好是那个连接要求所要连接的port,若是没有此server程式,TCP/IP核心会拒绝一个WSAECONNREFUSED给对方程式。

通常发生那个错误的缘故有几个。

利用者可能连接到错误的远端主机或是错误的port,也有可能是远端主机和port对了,可是server程式并无执行。

检查看看程式中的sockaddr_in结构有无填错?

sockaddr_in中的IP位址和port是不是以网路位元组顺序排列。

WSAELOOP(10062)太多层的符号式链结(Symboliclink)在UNIX作业系统中,那个错误的意思是指途径参考过量的符号式链结(symboliclink)。

WSAENAMETOOLONG(10063)档名太长在UNIX作业系统,那个错误的意思是指欲开启档案的途径名称(包括档案名称)太长。

WSAEHOSTDOWN(10064)对方主机关闭在柏克莱socket介面的说明中,那个错误发生的缘故是当远端主机关闭或系统出问题。

WSAEHOSTUNREACH(10065)无法联系对方主机在柏克莱socket介面中,那个错误的意思是无法和对方主机取得联系。

在WinSock方面,有类似的错误代码,读者能够参考WSAENETUNREACH那个错误的说明。

WSAEPROCLIM(10067)Toomanyprocesses.AWindowsSocketsimplementationmayhavealimitonthenumberofapplicationsthatmayuseitsimultaneously.WSAStartup()mayfailwiththiserrorifthelimithasbeenreached.WSASYSNOTREADY(10091)主机网路系统尚未备妥本地主机的网路系统尚未能正常运作。

假设发生那个错误,读者可能要检查一下有无(或32位元版本的那个档案?

那个档寄存的途径正确吗?

WSAVERNOTSUPPORTED(10092)不支援的版本错误发生的缘故是在呼唤WSAStartup()函式时所指定的WinSock版本不被现有的WinSock版本所支援。

假设

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1