socket常见错误代码解析

更新时间:2023-03-16 21:16:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

socket常见错误代码解析

Socket error 0 - Directly send error

Socket error 10004 - Interrupted function call Socket error 10013 - Permission denied Socket error 10014 - Bad address Socket error 10022 - Invalid argument Socket error 10024 - Too many open files

Socket error 10035 - Resource temporarily unavailable Socket error 10036 - Operation now in progress Socket error 10037 - Operation already in progress Socket error 10038 - Socket operation on non-socket Socket error 10039 - Destination address required Socket error 10040 - Message too long

Socket error 10041 - Protocol wrong type for socket Socket error 10042 - Bad protocol option Socket error 10043 - Protocol not supported Socket error 10044 - Socket type not supported Socket error 10045 - Operation not supported

Socket error 10046 - Protocol family not supported

Socket error 10047 - Address family not supported by protocol family Socket error 10048 - Address already in use

Socket error 10049 - Cannot assign requested address Socket error 10050 - Network is down

Socket error 10051 - Network is unreachable

Socket error 10052 - Network dropped connection on reset Socket error 10053 - Software caused connection abort Socket error 10054 - Connection reset by peer Socket error 10055 - No buffer space available Socket error 10056 - Socket is already connected Socket error 10057 - Socket is not connected

Socket error 10058 - Cannot send after socket shutdown Socket error 10060 - Connection timed out Socket error 10061 - Connection refused Socket error 10064 - Host is down Socket error 10065 - No route to host Socket error 10067 - Too many processes

Socket error 10091 - Network subsystem is unavailable Socket error 10092 - WINSOCK.DLL version out of range Socket error 10093 - Successful WSAStartup not yet performed Socket error 10094 - Graceful shutdown in progress Socket error 11001 - Host not found

Socket error 11002 - Non-authoritative host not found Socket error 11003 - This is a non-recoverable error

Socket error 11004 - Valid name, no data record of requested type

WSAEADDRINUSE (10048) Address already in use

WSAECONNABORTED (10053) Software caused connection abort WSAECONNREFUSED (10061) Connection refused WSAECONNRESET (10054) Connection reset by peer

WSAEDESTADDRREQ (10039) Destination address required WSAEHOSTUNREACH (10065) No route to host WSAEMFILE (10024) Too many open files WSAENETDOWN (10050) Network is down

WSAENETRESET (10052) Network dropped connection WSAENOBUFS (10055) No buffer space available

WSAENETUNREACH (10051) Network is unreachable WSAETIMEDOUT (10060) Connection timed out WSAHOST_NOT_FOUND (11001) Host not found

WSASYSNOTREADY (10091) Network sub-system is unavailable WSANOTINITIALISED (10093) WSAStartup() not performed WSANO_DATA (11004) Valid name, no data of that type WSANO_RECOVERY (11003) Non-recoverable query error WSATRY_AGAIN (11002) Non-authoritative host found

WSAVERNOTSUPPORTED (10092) Wrong WinSock DLL version

++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++ 常見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,通常是超級使用者(super user)才有此權限。如果一般的使用者企圖開啟SOCK_RAW的socket,將會得到這個錯誤訊息。

對於WinSock API函式接口,發生此錯誤的函式有二:send()和sendto()。當利用send()或sendto()傳送數據的時候,將目的地址設成廣播地址 ( broadcast address ),但是並未呼叫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()

對於datagram socket,socket沒有呼叫bind()函式指定IP地址、port和協議等;對於stream

socket,連接尚未建立

send()和sendto()

對於datagram socket,socket沒有呼叫bind()函式指定IP地址、port和協議等;對於stream socket,連接尚未建立

原則上,所有函式其參數所能設定的值有一定的範圍,或是有一些特定的值,這些函式都有可能發生這個錯誤。

WSAEMFILE (10024)太多開啟的檔案

柏 克萊socket接口的解釋是開啟過多的檔案,超過檔案開啟數的限制。在柏克萊socket將檔案和socket的開啟以檔案描述子(file descriptor)描述。 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()

利用datagram socket接收數據時,如果recv()、recvform()指定的緩衝區長度小於接收進來datagram,這時後過長的datagram會被丟棄並告訴函式WSAEMSGSIZE這個錯誤

send()、sendto()

利用datagram socket傳送數據時,如果送出的數據緩衝區大於WinSock所能傳遞datagram的最大長度,這時send()和sendto()傳回發生WSAEMSGSIZ這個錯誤訊息

WSAEPROTOTYPE (10041)錯誤的協議型別

錯 誤產生的原因是在socket()函式呼叫時指定了WinSock不支持的協議舉例來說,你不可以在steam socket(SOCK_STREAM)設定以UDP協議傳輸(IPPRO_UDP)。 stream socket並不支持UDP通訊協議。如果你真的有心去測試的話,程序中故意如此呼叫

socket():hSock=socket(AF_INET, SOCK_STREAM, IPPROTO_UDP);你會發現,這樣的socket()函式呼叫會得到WSAEPROTONOSUPPORT錯誤。這顯然不對,照理應該得到 WSAEPROTOTYPE這個錯誤才對。 WSAEPROTOTYPE這個錯誤表示指定了錯誤的協議,而所指定的協議是該地址家族(協議家族)所支持的,但不適用於socket型別。以上述的例子 來看,UDP協議是屬於AF_INET這個地址家族,但是並不能用於stream socket(SOCK_STREAM socket)上。 WSAEPROTONOSUPPORT這個錯誤表示所指定的協議是該協議家族所不支持的,意思上和WSAEPROTOTYPE有點出入。

事實上,WSAEPROTOTYPE和WSAEPROTONOSUPPORT之間的差別是微乎其微的。在發展網絡程序的時候,這兩種錯誤都是代表著同一種狀況--協議指定錯誤。

總之,你永遠也沒辦法試出WSAEPROTOTYPE這個錯誤。

WSAENOPROTOOPT (10042)錯誤的協議選項(option)

這 個錯誤主要是針對getsockopt()和setsockopt()函式的。這兩個函式可以以參數設定不同的選項而有不同的作用。對於每個選 項多多少少會有些限制,如有些選項只能用在stream socket,而有些只能用在datagram socket。如果違反這些限制,就會發生這個錯誤。請看下表:

SO_DONTLINGER

SO_KEEPALIVE

SO_LINGER

SO_OOBINLINE

TCP_NODELAY

datagram socket ( SOCK_DGRAM )不支持這些選項

SO_DEBUG

SO_DONTROUTE

SO_RCVBUF

SO_SNDBUF

TCP_NODELAY

有些廠商的WinSock TCP/IP協議核心不支持這些選項

SO_ACCEPTCONN

SO_ERROR

SO_TYPE

這些選項只適用於getsockopt()函式,不能作用於setsockopt()函式

WSAEPROTONOSUPPORT (10043)不支持的協議

WinSock 協議核心不支持所指定的通訊協議。舉例來說當你用socket()函式時,第二個參數指定為SOCK_STREAM,第三個參數指定為 IPPROTO_ICMP,如此socket()呼叫會得到WSAEPROTONOSUPPORT這個錯誤。 WinSock 1。1版並不支持ICMP協議,所以呼叫socket()指定ICMP這個協議,就會發生錯誤。事實上,產生WSAEPROTONPSUPPORT錯誤的 狀況不只這樣,詳見WSAEPROTOTYPE。

WSAESOCKTNOSUPPORT (10044)不支援的socket型別

目 前使用的WinSock版本不支持函式所指定的socket型別。舉例來說,完全根據WinSock 1.1版的規格書發展的WinSock協議核心,並不支持SOCK_RAW這個socket型別。在呼叫socket()函式時,地址家族選 AF_INET( PF_INET )而socket型別選SOCK_RAW的話,就會發生這個錯誤。

有些廠商發展的WinSock協議核心除了支持WinSock 1.1版的規格書所規範之外,還提供許多不同的功能。我們建議您在發展程序時,如果有必要用到這些額外的功能,請好好考慮一下和其它環境兼容性的問題。

WSAEOPNOTSUPP (10045)作用函式不支持此類socket

函 式作用不支持目前socket型別。舉例來說,accept()和listen()函式只能作用在連接導向的socket(stream socket),也就是stream socket上。對於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 1.1版的規格書中並沒有提到bind()函式會導致WSAEADDRNOTAVAIL錯誤,不過根據我們測試的結果,bind()也會導致這樣的錯誤。

WSAENETDOWN (10050)網絡出錯

下層的網絡系統發生問題,WinSock函式無法執行。這是一個相當嚴重的問題,這會使得幾乎所有的WinSock函式呼叫失敗。若你的WinSock函式發生錯誤,那麼請你該好好地檢查你的網絡卡,網絡卡驅動程序和你的WinSock協議核心。

WSAENETUNREACH (10051)無法連上指定的網絡

在柏克萊socket界面中,這個錯誤的意思是無法和對方網絡系統取得聯繫。在WinSock 1。1規格中,WSAENETUNREACH相通於柏克萊socket界面中的ETHOSTUNREACH。

WSAENETRESET (10052)網絡已被重新設定

對方主機出錯而重新開機。在本地主機呼叫和傳送數據有關的函式就會得到這個錯誤。對於setsockopt()函式,這個錯誤發生的原因在於試圖設定SO_KEEPALIVE於逾時(timeout)的連接。

WSAECONNABORTED (10053)中斷連接

在連接建立後,當有某種原因導致TCP/IP協議核心不斷地重送數據,而且都重送失敗的時候,TCP/IP協議將連接中斷。此時,應用程序就會收到WSACONNABORTED這個錯誤。

WSAECONNRESET (10054)連結已被對方重新設定

連結已被對方系統強迫中斷了。 TCP/IP協議核心如果偵測出stream socket的連接發生問題的話,它會傳一個表示連接重設(reset)的訊息給對方。此時對方程式會得到WSAECONNRESET的錯誤訊息。

WSAENOBUFS (10055)緩衝區過小

WinSock 核心無法配置足夠的緩衝區,無法執行該程序。這個錯誤的發生和整個Windows系統資源有關。如果整個Windows本身可用的資源就很 少,所能同時執行的程序也少。也有可能是執行了\不良\的應用程序,沒有正常的使用和歸還繫統資源(如內存)。或是某些應用程序的不正常關閉,也會佔用系 統資源。

WSAEISCONN (10056) socket已經連接

網絡函式通常會有一定的呼叫順序,有的函式 呼叫成功後便不能再呼叫,否則會出現錯誤。當連接建立時,client程序呼叫()成功,而 server程序呼叫accept()成功。此時若client程序再呼叫一次connect()函式的話,會得到WSAEISCONN這個錯誤,表示該 socket已經處於連接狀態了。如果client程序呼叫listen()函式的話也會出現這個錯誤,表示不應該在此時呼叫這個函式。對於server 程序,如果socket已經處於連接狀態,程序呼叫connect()函式的話,也會得到WSAEISCONN這個錯誤。

上述錯誤是 發生在stream socket上,因為stream socket才會建立連接。對於datagram socket,多次成功的connect()函式呼叫是被允許的(對於datdgram socket而言,呼叫connect()函式的目的不在於建立連接)。 datagram socket發生此錯誤的原因是在sendto()函式上,當呼叫sendto()傳送datagram時,如果對方地址填入 INADDR_ANY(“0.0.0.0”)而port填入0(在sockaddr_in結構中),就會導致WSAEISCONN這個錯誤。

WSAENOTCONN (10057) socket尚未連接

網絡函式通常會有一定的呼叫順序,有些函式必須先呼叫成功某函式才能呼叫。 WSAENOTCONN這個錯誤發生的原因很明顯,就是在連接建立之前,你試圖從連接對方取得數據或是傳送數據到對方,就會發生WSAENETCONN這個錯誤。

舉 例來說,對於stream socket,如果在建立連結前呼叫send()試圖傳送數據,或者是呼叫recv()試圖取得數據,就會發生這個錯誤,告訴你socket尚未建立連 接。你如果呼叫了getpeername()這個函式試圖去取得連接對方的socket,當然也會出現這個錯誤。對於setsockopt()這個函式, 如果設定SO_KEEPALIVE,但連接已被中斷的話,也會出現WSAENETCONN這個錯誤。

初學者可能在呼叫connect()函式之後沒有檢查是否函式呼叫錯誤,以致不知道是否連接已正確建立。

WSAESHUTDOWN (10058) socket已經關閉

這 個錯誤碼的意思是,無法再傳送數據了,因為socket已經經由shutdown()函式而關閉了。當你利用shutdown()關閉 socket之後,WinSock的TCP/IP協議核心就會關閉這個socket的傳送或接收的功能。有一點要注意的是,這個錯誤只會在stream socket出現。

WSAETOOMANYREFS (10059)參照(reference)太多,資源耗盡

在UNIX操作系統中的解釋是指系統核心資源消耗殆盡。不過在WinSock 1.1版的規格書中並沒有任何一個函式會發生這種錯誤。

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)太多層的符號式鏈接(Symbolic link)

在UNIX操作系統中,這個錯誤的意思是指路徑參考過多的符號式鏈接(symbolic link)。

本文来源:https://www.bwwdw.com/article/kruv.html

Top