精华内容
下载资源
问答
  • Socket 错误返回码

    千次阅读 2015-01-27 14:15:59
    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 ...
    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 错误返回码 说明总结

    千次阅读 2009-12-18 12:59:00
    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 ...

    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)。

    WSAENAMETOOLONG (10063) 檔名過長

    在UNIX作業系統,這個錯誤的意思是指欲開啟檔案的路徑名稱(包括檔案名稱)太長。

    WSAEHOSTDOWN (10064) 對方主機關閉

    在柏克萊socket介面的解釋中,這個錯誤發生的原因是當遠端主機關閉或系統出問題。

    WSAEHOSTUNREACH (10065) 無法聯繫對方主機

    在柏克萊socket介面中,這個錯誤的意思是無法和對方主機取得聯繫。在WinSock方面,有類似的錯誤代碼,讀者可以參考WSAENETUNREACH這個錯誤的說明。

    WSAEPROCLIM (10067) Too many processes.

    A Windows Sockets implementation may have a limit on the number of applications that may use it simultaneously. WSAStartup() may fail with this error if the limit has been reached.

    WSASYSNOTREADY (10091) 主機網路系統尚未備妥

    本地主機的網路系統尚未能正常運作。若發生這個錯誤,讀者可能要檢查一下有沒有WINSOCK.DLL(或32位元版本的WSOCK32.DLL)這個檔案?這個檔存放的路徑正確嗎?

    WSAVERNOTSUPPORTED (10092) 不支援的WinSock.DLL版本錯誤發生的原因是在呼叫WSAStartup()函式時所指定的WinSock版本不被現有的WinSock版本所支援。若發生這個錯誤,讀者要確定一下本地Windows系統中的WinSock版本和該版本所能支援的版本是如何等等。通常較新的版本同時能支援新舊版本的WinSock,建議讀者能使用較新的WinSock版本。

    WSANOTINITIALISED (10093) 未執行WSAStartup()

    應用程式沒有呼叫WSAStartup()或是呼叫WSAStartup()失敗。應用程式要成功地呼叫WSAStartup()才能使用WinSock.DLL,否則會有此錯誤訊息出現。

    WSAEDISCON (10101) Graceful shutdown in progress.

    Returned by WSARecv(), WSARecvFrom() to indicate the remote party has initiated a graceful shutdown sequence.

    WSATYPE_NOT_FOUND (10109) Class type not found

    The specified class was not found.

    WSAHOST_NOT_FOUND (11001) 已經證實找不到主機

    當你使用網路資料函式尋找主機的資料,而該主機不存在時,就會發生這個錯誤。尋找網路主機資料的方法通常是先尋找本地主機的網路名稱表(host檔),如果找不到再透過DNS的途徑去找,如果再找不到,通常就會回給函式這樣的錯誤。

    發生這樣的錯誤時,檢查看看本地主機的主機名稱解譯的設定有沒有問題。比較可能出現問題的是DNS的設定,確定是不是設定錯誤的DNS server。如果DNS server正確,確定一下DNS server有沒有跑起來。你可以利用ping這個程式看看DNS server有沒有跑起來,如果沒有ping這個程式,你可以試著去解釋一個確定存在的主機,看看DNS server有沒有在正常運作中。

    WSATRY_AGAIN (11002) 找不到網路資料,但未被證實

    這是一個暫時性的錯誤,告訴你目前找不到所要找的網路資料,你可以再試試看。

    WSANO_RECOVERY (11003) 無法挽救的錯誤

    對於查詢主機名稱而言,這個錯誤發生的原因是由網域名稱系統(Domain Name System, DNS)所出現的錯誤所引起的。這些錯誤包括DNS的FORMERR、REFUSED和NOTIMP等錯誤,詳細請參考RFC1035有關網域名稱系統的文件。

    對於查詢服務和協定資料而言,這個錯誤發生的原因是找不到存放網路資料的資料庫。這個資料庫通常是在本地主機上的檔案,如SERVICES和PROTOCOL這兩個檔。

    WSANO_DATA (11004) 名稱合法,但查無此資料

    查詢格式是正確的,但是查無此資料存在。這通常是暫時性的錯誤,可能在不同的網路資料伺服器中能找到這份資料。

    WSAPROVIDERFAILEDINIT (OS dependent) Unable to initialize a service provider.

    Either a service provider's DLL could not be loaded (LoadLibrary() failed) or the provider's WSPStartup/NSPStartup function failed.

    WSASYSCALLFAILURE (OS dependent) System call failure..

    Returned when a system call that should never fail does. For example, if a call to WaitForMultipleObjects() fails or one of the registry APIs fails trying to manipulate the

    protocol/namespace catalogs.

    WSA_INVALID_HANDLE (OS dependent) Specified event object handle is invalid.

    An application attempts to use an event object, but the specified handle is not valid.

    WSA_INVALID_PARAMETER (OS dependent) One or more parameters are invalid.

    An application used a WinSock function which directly maps to a Win32 function. The Win32 function is indicating a problem with one or more parameters.

    WSAINVALIDPROCTABLE (OS dependent) Invalid procedure table from service provider.

    A service provider returned a bogus proc table to WS2_32.DLL. (Usually caused by one or more of the function pointers being NULL.)

    WSAINVALIDPROVIDER (OS dependent) Invalid service provider version number.

    A service provider returned a version number other than 2.2.

    WSA_IO_INCOMPLETE (OS dependent) Overlapped I/O event object not in signaled state.

    The application has tried to determine the status of an overlapped operation which is not yet completed. Applications that use WSAGetOverlappedResult() (with the fWait flag set to false) in a polling mode to determine when an overlapped operation has completed will get this error code until the operation is complete.

    WSA_IO_PENDING (OS dependent) Overlapped operations will complete later.

    The application has initiated an overlapped operation which cannot be completed immediately. A completion indication will be given at a later time when the operation has been completed.

    WSA_NOT_ENOUGH_MEMORY (OS dependent) Insufficient memory available.

    An application used a WinSock function which directly maps to a Win32 function. The Win32 function is indicating a lack of required memory resources.7

    展开全文
  • linux下socket错误返回码

    千次阅读 2013-08-16 22:17:00
    2.客户端到服务端的网络能通,服务程序挂掉,客户端程序会马上退出,因为服务端能正常返回错误消息,客户端收到,SIGPIPE信号就产生了。不过我不确定此时服务端返回是的RST响应,抓包来看没有RST标志。水平有限,只...


    符号名  信号值 描述                是否符合POSIX
    SIGHUP  1   在控制终端上检测到挂断或控制线程死亡  是
    SIGINT  2   交互注意信号              是
    SIGQUIT  3   交互中止信号              是
    SIGILL  4   检测到非法硬件的指令          是
    SIGTRAP  5   从陷阱中回朔              否
    SIGABRT  6   异常终止信号              是
    SIGEMT  7   EMT 指令                否
    SIGFPE  8   不正确的算术操作信号          是
    SIGKILL  9   终止信号                是
    SIGBUS  10   总线错误                否
    SIGSEGV  11   检测到非法的内存调用          是
    SIGSYS  12   系统call的错误参数           否
    SIGPIPE  13   在无读者的管道上写           是
    SIGALRM  14   报时信号                是
    SIGTERM  15   终止信号                是
    SIGURG  16   IO信道紧急信号             否
    SIGSTOP  17   暂停信号                是
    SIGTSTP  18   交互暂停信号              是
    SIGCONT  19   如果暂停则继续             是
    SIGCHLD  20   子线程终止或暂停            是
    SIGTTIN  21   后台线程组一成员试图从控制终端上读出  是
    SIGTTOU  22   后台线程组的成员试图写到控制终端上   是
    SIGIO   23   允许I/O信号               否
    SIGXCPU  24   超出CPU时限               否
    SIGXFSZ  25   超出文件大小限制            否
    SIGVTALRM 26   虚时间警报器              否
    SIGPROF  27   侧面时间警报器             否
    SIGWINCH 28   窗口大小的更改             否
    SIGINFO  29   消息请求                否
    SIGUSR1  30   保留作为用户自定义的信号1        是
    SIGUSR2  31   保留作为用户自定义的信号        是 
    注意:Linux信号机制基本上是从Unix系统中继承过来的。早期Unix系统中的信号机制比较简单和原始,后来在实践中暴露出一些问题,因此,把那些建立在早期机制上的信号叫做"不可靠信号",信号值小于SIGRTMIN(Red hat 7.2中,SIGRTMIN=32,SIGRTMAX=63)的信号都是不可靠信号。这就是"不可靠信号"的来源。它的主要问题是:进程每次处理信号后,就将对信号的响应设置为默认动作。在某些情况下,将导致对信号的错误处理;因此,用户如果不希望这样的操作,那么就要在信号处理函数结尾再一次调用signal(),重新安装该信号。
    另外,我再做一些补充,产生RST响应以至于系统发出SIGPIPE信号,应该分为两种情况:
    1. 客户端到服务端之间网络断掉,或者服务端断电等,物理连接断掉了,这种情况下客户端不会退出,send函数正常执行,不会感觉到自己出错。因为由于物理网络断开,服务端不会给客户端回应错误消息,没有RST响应,自然也不会产生SIGPIPE信号。但是当服务端再恢复正常的时候,对客户端send来的消息会产生RST响应,客户端就收到SIGPIPE信号了,程序退出,但是这时send函数是能够返回 -1的。可以进行异常处理。
    2.客户端到服务端的网络能通,服务程序挂掉,客户端程序会马上退出,因为服务端能正常返回错误消息,客户端收到,SIGPIPE信号就产生了。不过我不确定此时服务端返回是的RST响应,抓包来看没有RST标志。水平有限,只写到这了。
    展开全文
  • socket 错误码

    2015-01-29 19:51:02
    socket错误码: EINTR: 4 阻塞的操作被取消阻塞的调用打断。如设置了发送接收超时,就会遇到这种错误。 只能针对阻塞模式的socket。读,写阻塞的socket时,-1返回,错误号为INTR。另外,如果出现EINTR即...

    原文地址:http://blog.csdn.net/davintanger/article/details/7679567


    socket错误码:


    EINTR: 4
    阻塞的操作被取消阻塞的调用打断。如设置了发送接收超时,就会遇到这种错误。
    只能针对阻塞模式的socket。读,写阻塞的socket时,-1返回,错误号为INTR。另外,如果出现EINTR即errno为4,错误描述 Interrupted system call,操作也应该继续。如果recv的返回值为0,那表明连接已经断开,接收操作也应该结束。


    ETIMEOUT:110
    1、操作超时。一般设置了发送接收超时,遇到网络繁忙的情况,就会遇到这种错误。
    2、服务器做了读数据做了超时限制,读时发生了超时。
    3、错误被描述为“connect time out”,即“连接超时”,这种情况一般发生在服务器主机崩溃。此时客户 TCP 将在一定时间内(依具体实现)持续重发数据分节,试图从服务 TCP 获得一个 ACK 分节。当最终放弃尝试后(此时服务器未重新启动),内核将会向客户进程返回 ETIMEDOUT 错误。如果某个中间路由器判定该服务器主机已经不可达,则一般会响应“destination unreachable”-“目的地不可达”的ICMP消息,相应的客户进程返回的错误是 EHOSTUNREACH 或ENETUNREACH。当服务器重新启动后,由于 TCP 状态丢失,之前所有的连接信息也不存在了,此时对于客户端发来请求将回应 RST。如果客户进程对检测服务器主机是否崩溃很有必要,要求即使客户进程不主动发送数据也能检测出来,那么需要使用其它技术,如配置 SO_KEEPALIVE Socket 选项,或实现某些心跳函数。


    EAGAIN:
    1、Send返回值小于要发送的数据数目,会返回EAGAIN和EINTR。
    2、recv 返回值小于请求的长度时说明缓冲区已经没有可读数据,但再读不一定会触发EAGAIN,有可能返回0表示TCP连接已被关闭。
    3、当socket是非阻塞时,如返回此错误,表示写缓冲队列已满,可以做延时后再重试.
    4、在Linux进行非阻塞的socket接收数据时经常出现Resource temporarily unavailable,errno代码为11(EAGAIN),表明在非阻塞模式下调用了阻塞操作,在该操作没有完成就返回这个错误,这个错误不会破坏 socket的同步,不用管它,下次循环接着recv就可以。对非阻塞socket而言,EAGAIN不是一种错误。


    EPIPE:
    1、Socket 关闭,但是socket号并没有置-1。继续在此socket上进行send和recv,就会返回这种错误。这个错误会引发SIGPIPE信号,系统会将 产生此EPIPE错误的进程杀死。所以,一般在网络程序中,首先屏蔽此消息,以免发生不及时设置socket进程被杀死的情况。
    2、write(..) on a socket that has been closed at the other end will cause a SIGPIPE.
    3、错误被描述为“broken pipe”,即“管道破裂”,这种情况一般发生在客户进程不理会(或未及时处理)Socket 错误,继续向服务 TCP 写入更多数据时,内核将向客户进程发送 SIGPIPE 信号,该信号默认会使进程终止(此时该前台进程未进行 core dump)。结合上边的 ECONNRESET 错误可知,向一个 FIN_WAIT2 状态的服务 TCP(已 ACK 响应 FIN 分节)写入数据不成问题,但是写一个已接收了 RST 的 Socket 则是一个错误。


    EBADF:
    read(..) or write(..) on a locally closed socket will return EBADF


    EFAULT:
    地址错误。


    EBUSY:


    ECONNREFUSED:
    1、拒绝连接。一般发生在连接建立时。
    拔服务器端网线测试,客户端设置keep alive时,recv较快返回0, 先收到ECONNREFUSED (Connection refused)错误码,其后都是ETIMEOUT。
    2、an error returned from connect(), so it can only occur in a client (if a client is defined as the party that initiates the connection


    ECONNRESET:
    1、在客户端服务器程序中,客户端异常退出,并没有回收关闭相关的资源,服务器端会先收到ECONNRESET错误,然后收到EPIPE错误。
    2、连接被远程主机关闭。有以下几种原因:远程主机停止服务,重新启动;当在执行某些操作时遇到失败,因为设置了“keep alive”选项,连接被关闭,一般与ENETRESET一起出现。
    3、远程端执行了一个“hard”或者“abortive”的关闭。应用程序应该关闭socket,因为它不再可用。当执行在一个UDP socket上时,这个错误表明前一个send操作返回一个ICMP“port unreachable”信息。
    4、如果client关闭连接,server端的select并不出错(不返回-1,使用select对唯一一个socket进行non- blocking检测),但是写该socket就会出错,用的是send.错误号:ECONNRESET.读(recv)socket并没有返回错误。
    5、该错误被描述为“connection reset by peer”,即“对方复位连接”,这种情况一般发生在服务进程较客户进程提前终止。当服务进程终止时会向客户 TCP 发送 FIN 分节,客户 TCP 回应 ACK,服务 TCP 将转入 FIN_WAIT2 状态。此时如果客户进程没有处理该 FIN (如阻塞在其它调用上而没有关闭 Socket 时),则客户 TCP 将处于 CLOSE_WAIT 状态。当客户进程再次向 FIN_WAIT2 状态的服务 TCP 发送数据时,则服务 TCP 将立刻响应 RST。一般来说,这种情况还可以会引发另外的应用程序异常,客户进程在发送完数据后,往往会等待从网络IO接收数据,很典型的如 read 或 readline 调用,此时由于执行时序的原因,如果该调用发生在 RST 分节收到前执行的话,那么结果是客户进程会得到一个非预期的 EOF 错误。此时一般会输出“server terminated prematurely”-“服务器过早终止”错误。
     
    EINVAL:
    无效参数。提供的参数非法。有时也会与socket的当前状态相关,如一个socket并没有进入listening状态,此时调用accept,就会产生EINVAL错误。


    EMFILE:
    打开了太多的socket。对进程或者线程而言,每种实现方法都有一个最大的可用socket数目处理,或者是全局的,或者是局部的。


    EWOULDBLOCK:EAGAIN
    资源暂时不可用。这个错误是从对非阻塞socket进行的不能立即结束的操作返回的,如当没有数据在队列中可以读时,调用recv。并不是 fatal错误,稍后操作可以被重复。调用在一个非阻塞的SOCK_STREAM socket 上调用connect时会产生这个错误,因为有时连接建立必须消耗一定的时间。
     
    ENOTCONN
    在一个没有建立连接的socket上,进行read,write操作会返回这个错误。出错的原因是socket没有标识地址。Setsoc也可能会出错。


    ECONNRESET
     Connection reset by peer.
     连接被远程主机关闭。有以下几种原因:远程主机停止服务,重新启动;当在执行某些操作时遇到失败,因为设置了“keep alive”选项,连接被关闭,一般与ENETRESET一起出现。
     
    ECONNABORTED
    1、软件导致的连接取消。一个已经建立的连接被host方的软件取消,原因可能是数据传输超时或者是协议错误。
    2、该错误被描述为“software caused connection abort”,即“软件引起的连接中止”。原因在于当服务和客户进程在完成用于 TCP 连接的“三次握手”后,客户 TCP 却发送了一个 RST (复位)分节,在服务进程看来,就在该连接已由 TCP 排队,等着服务进程调用 accept 的时候 RST 却到达了。POSIX 规定此时的 errno 值必须 ECONNABORTED。源自 Berkeley 的实现完全在内核中处理中止的连接,服务进程将永远不知道该中止的发生。服务器进程一般可以忽略该错误,直接再次调用accept。
       当TCP协议接收到RST数据段,表示连接出现了某种错误,函数read将以错误返回,错误类型为ECONNERESET。并且以后所有在这个套接字上的读操作均返回错误。错误返回时返回值小于0。


    ENETUNREACH
    网络不可达。Socket试图操作一个不可达的网络。这意味着local的软件知道没有路由到达远程的host。


    ENETRESET
    网络重置时丢失连接。
    由于设置了"keep-alive"选项,探测到一个错误,连接被中断。在一个已经失败的连接上试图使用setsockopt操作,也会返回这个错误。


    EINPROGRESS:
    操作正在进行中。一个阻塞的操作正在执行。


    ENOTSOCK:
    在非socket上执行socket操作。


    EDESTADDRREQ:
    需要提供目的地址。
    在一个socket上的操作需要提供地址。如往一个ADDR_ANY 地址上进行sendto操作会返回这个错误。


    EMSGSIZE:
    消息体太长。
    发送到socket上的一个数据包大小比内部的消息缓冲区大,或者超过别的网络限制,或是用来接收数据包的缓冲区比数据包本身小。


    EPROTOTYPE
    协议类型错误。标识了协议的Socket函数在不支持的socket上进行操作。如ARPA Internet
    UDP协议不能被标识为SOCK_STREAM socket类型。


    ENOPROTOOPT
    该错误不是一个 Socket 连接相关的错误。errno 给出该值可能由于,通过 getsockopt 系统调用来获得一个套接字的当前选项状态时,如果发现了系统不支持的选项参数就会引发该错误。


    EPROTONOSUPPORT
    不支持的协议。系统中没有安装标识的协议,或者是没有实现。如函数需要SOCK_DGRAM socket,但是标识了stream protocol.。


    ESOCKTNOSUPPORT
    Socket类型不支持。指定的socket类型在其address family中不支持。如可选选中选项SOCK_RAW,但实现并不支持SOCK_RAW sockets。


    EOPNOTSUPP
     Operation not supported.
      The attempted operation is not supported for the type of object referenced. Usually this occurs when a socket descriptor to a socket that cannot support this operation, for example, trying to accept a connection on a datagram socket.


    EPFNOSUPPORT
     Protocol family not supported.
     The protocol family has not been configured into the system or no implementation for it exists. Has a slightly different meaning to EAFNOSUPPORT, but is interchangeable in most cases, and all Windows Sockets functions that return one of these specify EAFNOSUPPORT.


    EAFNOSUPPORT
     Address family not supported by protocol family.
     An address incompatible with the requested protocol was used. All sockets are created with an associated "address family" (i.e. AF_INET for Internet Protocols) and a generic protocol type (i.e. SOCK_STREAM). This error will be returned if an incorrect protocol is explicitly requested in the socket call, or if an address of the wrong family is used for a socket, e.g. in sendto.
     
    EADDRINUSE
     Address already in use.
     Only one usage of each socket address (protocol/IP address/port) is normally permitted. This error occurs if an application attempts to bind a socket to an IP address/port that has already been used for an existing socket, or a socket that wasn't closed properly, or one that is still in the process of closing. For server applications that need to bind multiple sockets to the same port number, consider using setsockopt(SO_REUSEADDR). Client applications usually need not call bind at all - connect will choose an unused port automatically. When bind is called with a wild-card address (involving ADDR_ANY), a EADDRINUSE error could be delayed until the specific address is "committed." This could happen with a call to other function later, including connect, listen, Connect or JoinLeaf.


    EADDRNOTAVAIL
     Cannot assign requested address.
     The requested address is not valid in its context. Normally results from an attempt to bind to an address that is not valid for the local machine. This can also result from connect, sendto, Connect, JoinLeaf, or SendTo when the remote address or port is not valid for a remote machine (e.g. address or port 0).
     
    ENETDOWN
     Network is down.
     A socket operation encountered a dead network. This could indicate a serious failure of the network system (i.e. the protocol stack that the WinSock DLL runs over), the network interface, or the local network itself.
     
    ENOBUFS
     No buffer space available.
     An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.


    EISCONN
     Socket is already connected.
     A connect request was made on an already connected socket. Some implementations also return this error if sendto is called on a connected SOCK_DGRAM socket (For SOCK_STREAM sockets, the to parameter in sendto is ignored), although other implementations treat this as a legal occurrence.


    连接过程可能出现的错误情况有:
    (1) 如果客户机TCP协议没有接收到对它的SYN数据段的确认,函数以错误返回,错误类型为ETIMEOUT。通常TCP协议在发送SYN数据段失败之后,会多次发送SYN数据段,在所有的发送都高中失败之后,函数以错误返回。


    注:SYN(synchronize)位:请求连接。TCP用这种数据段向对方TCP协议请求建立连接。在这个数据段中,TCP协议将它选择的初始 序列号通知对方,并且与对方协议协商最大数据段大小。SYN数据段的序列号为初始序列号,这个SYN数据段能够被确认。当协议接收到对这个数据段的确认之 后,建立TCP连接。


    (2) 如果远程TCP协议返回一个RST数据段,函数立即以错误返回,错误类型为ECONNREFUSED。当远程机器在SYN数据段指定的目的端口号处没有服 务进程在等待连接时,远程机器的TCP协议将发送一个RST数据段,向客户机报告这个错误。客户机的TCP协议在接收到RST数据段后不再继续发送SYN 数据段,函数立即以错误返回。


    注:RST(reset)位:表示请求重置连接。当TCP协议接收到一个不能处理的数据段时,向对方TCP协议发送这种数据段,表示这个数据段所标 识的连接出现了某种错误,请求TCP协议将这个连接清除。有3种情况可能导致TCP协议发送RST数据段:(1)SYN数据段指定的目的端口处没有接收进 程在等待;(2)TCP协议想放弃一个已经存在的连接;(3)TCP接收到一个数据段,但是这个数据段所标识的连接不存在。接收到RST数据段的TCP协 议立即将这条连接非正常地断开,并向应用程序报告错误。


    (3) 如果客户机的SYN数据段导致某个路由器产生“目的地不可到达”类型的ICMP消息,函数以错误返回,错误类型为EHOSTUNREACH或 ENETUNREACH。通常TCP协议在接收到这个ICMP消息之后,记录这个消息,然后继续几次发送SYN数据段,在所有的发送都告失败之后,TCP 协议检查这个ICMP消息,函数以错误返回。


    注:ICMP:Internet 消息控制协议。Internet的运行主要是由Internet的路由器来控制,路由器完成IP数据包的发送和接收,如果发送数据包时发生错误,路由器使 用 ICMP协议来报告这些错误。ICMP数据包是封装在IP数据包的数据部分中进行传输的,其格式如下:


    类型码
    校验和
    数据


    0 8 16 24 31
    类型:指出ICMP数据包的类型。
    代码:提供ICMP数据包的进一步信息。
    校验和:提供了对整个ICMP数据包内容的校验和。
    ICMP数据包主要有以下类型:
    (1) 目的地不可到达:A、目的主机未运行;B、目的地址不存在;C、路由表中没有目的地址对应的条目,因而路由器无法找到去往目的主机的路由。
    (2) 超时:路由器将接收到的IP数据包的生存时间(TTL)域减1,如果这个域的值变为0,路由器丢弃这个IP数据包,并且发送这种ICMP消息。
    (3) 参数出错:当IP数据包中有无效域时发送。
    (4) 重定向:将一条新的路径通知主机。
    (5) ECHO请求、ECHO回答:这两条消息用语测试目的主机是否可以到达。请求者向目的主机发送ECHO请求ICMP数据包,目的主机在接收到这个ICMP数据包之后,返回ECHO回答ICMP数据包。
    (6) 时戳请求、时戳回答:ICMP协议使用这两种消息从其他机器处获得其时钟的当前时间。


     调用函数connect的过程中,当客户机TCP协议发送了SYN数据段的确认之后,TCP状态由CLOSED状态转为SYN_SENT状态,在接 收到对 SYN数据段的确认之后,TCP状态转换成ESTABLISHED状态,函数成功返回。如果调用函数connect失败,应该用close关闭这个套接字 描述符,不能再次使用这个套接字描述符来调用函数connect。


    connect函数的出错处理:
    (1)ETIMEOUT-connection timed out 目的主机不存在,没有返回任何相应,例如主机关闭
    (2)ECONNREFUSED-connection refused(硬错)到达目的主机后,由于各种原因建立不了连接,主机返回RST(复位)响应,例如主机监听进程未启用,tcp取消连接等
    (3)EHOSTTUNREACH-no route to host(软错)路由上引发了一个目的地不可达的ICMP错误
      其中(1)(3),客户端会进行定时多次重试,一定次数后才返回错误。另外,当connect连接失败时,sockfd套接口不可用,必须关闭后重新socket分配才行。


    getsockopt 和 setsockopt 还可能引发以下错误:
    getsockopt/setsockopt(2) man page 写道


    ERRORS
    The getsockopt() and setsockopt() system calls will succeed unless:
    [EBADF] The argument socket is not a valid file descriptor.
    [EFAULT] The address pointed to by option_value is not in a valid part of the process dress space. For getsockopt(), this error may also be returned if option_len is not in a valid part of the process address space.
    [EINVAL] The option is invalid at the level indicated.
    [ENOBUFS]Insufficient memory buffers are available.
    [ENOPROTOOPT] The option is unknown at the level indicated.
    [ENOTSOCK] The argument socket is not a socket (e.g., a plain file).


    The setsockopt() system call will succeed unless:
    [EDOM] The argument option_value is out of bounds.
    [EISCONN]socket is already connected and a specified option cannot be set while this is the case.

    展开全文
  • socket连接返回错误码

    2015-07-21 16:37:00
    对非锁定套接字来说,如果请求操作不能立即执行的话,通常会返回这个错误。比如说,在一个非暂停套接字上调用 connect,就会返回这个错误。因为连接请求不能立即执行。   10037—WSAEALREADY   操作...
  • socket 调用 connect连接 WSAGetLastError 返回错误码36 是什么意思
  • Socket 错误分析及错误码

    千次阅读 2014-01-02 23:57:59
    错误分析及错误码 平台:xp sp3+vc6。 测试方法:  retval = function(....)  if(retval == SOCKET_ERROR)  r = WSAGetLastError();  各种情况下的返回值由retval取得。  错误号由r...
  • socket 返回状态

    千次阅读 2018-10-25 15:38:38
    #define EPROTOTYPE 91 // Protocol wrong type for socket 错误协议类型 #define ENOPROTOOPT 92 // Protocol not available 协议不可用 #define EPROTONOSUPPORT 93 // Protocol not supported 不支持协议 #...
  • Socket/Epoll主要流程对socket错误码正确处理 【https://blog.csdn.net/whycold/article/details/48179659】 注:转载一个同事的工作笔记。 以下是对相关流程和socket错误码正确处理的小结。 一. Socket/Epoll...
  • SOCKET错误码详解

    千次阅读 2013-11-27 09:12:32
    WSAEINVAL 10022 ...The socket has not been bound with bind, or an unknown flag was specified, or MSG_OOB was specified for a socket with SO_OOBINLINE enabled or (for byte stream sockets only)
  • linux下用c网络编程用sendto发送数据,总返回socket error代号22是什么错误呢?
  • window下 PHP socket 错误码预定义常量, 对应数值,错误信息! php版本: PHP 7.4.0 (cli) (built: Nov 27 2019 10:14:18) ( ZTS Visual C++ 2017 x64 ) Copyright © The PHP Group Zend Engine v3.4.0, ...
  • windows socket错误码及出错原因

    千次阅读 2011-03-22 20:06:00
        windows socket错误码及出错原因 Windows Sockets在头文件winsock.h中定义了所有的错误,它们包括以“WSA”打头的Windows Sockets实现返回的错误和Berkeley Sockets定义的错误...
  • socket 错误码errno

    千次阅读 2014-11-06 09:38:44
     当TCP协议接收到RST数据段,表示连接出现了某种错误,函数read将以错误返回,错误类型为ECONNERESET。并且以后所有在这个套接字上的读操作均返回错误。错误返回时返回值小于0。 ENETUNREACH 网络不可...
  • C/C++ — Socket通讯错误码解释

    千次阅读 2019-02-26 14:59:36
    #define EAGAIN 11 /* Try again */ 重试,非阻塞socket一般在缓冲区无数据时返回,阻塞socket标识超时 #define ENOMEM 12 /* Out of memory */ 内存不足 #define EACCES 13 /* Permission denied */ 没有权限...
  • 常见错误码详解: Socket error 10048 - Address already in use (bind) Socket error 10049 - Cannot assign requested address 无法使用该地址(bind) Socket error 10054 - Connection reset by peer 远程主机...
  • 关于socket的各种错误码

    万次阅读 2018-12-20 21:34:55
    1、INVALID_SOCKET : 表示该 socket fd 无效。如 accept(2) 或 socket(2) 等在创建socketfd时: int m_socket = socket(AF_INET, SOCK_STREAM, 0); if (m_socket == INVALID_SOCKET){ printf("socket ...
  • Socket错误码及原因 (合集)

    千次阅读 2008-11-07 10:26:00
    本文转自http://blog.csdn.net/khler/archive/2007/07/11/1685023.aspx Windows Sockets在头文件winsock.h中定义了所有的错误码,它们包括以“WSA”打头的Windows Sockets实现返回错误码和Berkeley Sockets定义的...
  • Socket错误

    万次阅读 2012-04-05 17:36:13
    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 argumen
  • 目录 人为重启被中断的系统调用 安装信号时设置 SA_RESTART...永远阻塞的系统调用是指调用永远无法返回,多数网络支持函数都属于这一类。如:若没有客户连接到服务器上,那么服务器的accept调用就会永远阻塞。 ...
  • Linux下非阻塞Socket发送错误返回

    千次阅读 2012-04-21 15:32:46
    项目中使用原有的网络发送...经过仔细排查,是Socket的send函数调用结果处理不正确造成的。 原有代码: int SendData( char *data,int length ) { int ret; int cur_pos = 0; while(cur_pos ) { ret = send(ha

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 78,014
精华内容 31,205
关键字:

如何获取socket错误返回码