常見socket錯誤返回碼_第1頁
常見socket錯誤返回碼_第2頁
常見socket錯誤返回碼_第3頁
已閱讀5頁,還剩24頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、常見socket錯誤返回碼常見 SOCKET 錯誤返回碼(轉(zhuǎn))WSAEINTR (10004) 被中斷的系統(tǒng)呼叫當以阻攔式進行的 WinSock 函式被 WSACancelBlockingCall() 中 斷的時候, 這個阻攔式函式會得到 WSAEINTR 這個錯誤訊息。 讀者 要注意的是,當你的程式有用 WSACancelBlockingCall 去中斷阻 攔式函式的時候, 你必須為這個阻攔式函式寫處理 WSAEINTR 錯誤 訊息的程式碼,否則你的程式可能會出現(xiàn)些無預期的錯誤。原則上,所有能以阻攔式進行的函式都可能會發(fā)生這個錯誤。WSAEBADF (10009) 錯誤的檔案代碼柏克萊 so

2、cket 介面中,檔案描述子和 socket 描述子是相通的,開 啟 socket 可以想像成開啟一個檔案。 WSAEBADF 在柏克萊 socket 介面的意義是指錯誤的 socket 描述子,這個錯誤的 socket 描述子可能是未經(jīng)開啟的 socket 或是以關閉的 socket 。在 WinSock 中有個相通的錯誤代碼 WSAENOTSOCK ,用來指定錯 誤的 socket 描述子。詳細說明請參考 WSAENOTSOCK 部分。WSAEACCES (10013) 無此權(quán)限 對于柏克萊 socket 介面函式,這個錯誤發(fā)生的原因通常是開啟一個 不具有開啟權(quán)限的檔案或 socket 。

3、例如在 UNIX 上,一般的使用者 不能開啟 SOCK_RAW 的 socket ,通常是超級使用者 (super user) 才有此權(quán)限。如果一般的使用者企圖開啟 SOCK_RAW 的 socket , 將會得到這個錯誤訊息。對于 WinSock API 函式介面,發(fā)生此錯誤的函式有二: send() 和 sendto() 。當利用 send() 或 sendto() 傳送資料的時候,將目的位址 設成廣播位址 ( broadcast address ) ,但是并未呼叫 setsockopt() 設定 SO_BROADCAST 選項時便會發(fā)生 WSAEACCES 錯誤。WSAEFAULT (1

4、0014) 錯誤的記憶體位址 系統(tǒng)偵測出使用錯誤的記憶體位址。呼叫 WinSock 函式時,常常會 有參數(shù)是以指標的方式傳入,這個指標可能是指向一個結(jié)構(gòu),如 sockaddr_in 結(jié)構(gòu),或是指向一個資料緩沖區(qū)。當程式不小心傳入 一個錯誤記憶體未指的指標時,就會發(fā)生 WSAEFAULT 這個錯誤。 此外,當指標所指向的記憶體區(qū)塊太小的時候,也會發(fā)生這個錯誤。WSAEINVAL (10022) 參數(shù)錯誤 如果傳入不正確的參數(shù)給 WinSock 函式的話,會導致 WSAEINVAL 這個錯誤。如果參數(shù)是一個結(jié)構(gòu)的指標, 此結(jié)構(gòu)內(nèi)容填入不正確的值, 也會導致這個錯誤。例如, shutdown() 函

5、式的 how() 參數(shù)只能是 0、 1 或 2,若是設定成其他數(shù)值,就會出現(xiàn)這個錯誤。在網(wǎng)路程式的設計中, 函式和函式之間的呼叫通常有一定的順序, 如 過不照這個順序進行, 也會出現(xiàn)這個錯誤。 底下是針對每個相關函式 的詳細說明。函式錯誤發(fā)生的時機accept()呼叫 accept() 之前沒有成功呼叫 listen()bind()已經(jīng)成功呼叫 bind() 函式而指定 stocket 的名稱了getstockname()沒有呼叫 bind() 函式指定 socket 名稱listen()已經(jīng)處于連接狀態(tài)或是 socket 沒有呼叫 bind() 函式指定 socket 名稱recv() 和

6、recvfrom()對于 datagram socket ,socket 沒有呼叫 bind() 函式指定 IP 位址、port 和協(xié)定等;對于 stream socket ,連接尚未建立send() 和 sendto()對于 datagram socket ,socket 沒有呼叫 bind() 函式指定 IP 位址、port 和協(xié)定等;對于 stream socket ,連接尚未建立原則上,所有函式其參數(shù)所能設定的值有一定的范圍, 或是有一些特 定的值,這些函式都有可能發(fā)生這個錯誤。WSAEMFILE (10024) 太多開啟的檔案柏克萊 socket 介面的解釋是開啟過多的檔案,超過檔案

7、開啟數(shù)的限制。在柏克萊 socket 將檔案和 socket 的開啟以檔案描述子 (filedescriptor) 描述。 WinSock 對于 socket 是有別于檔案的,WSAEMFILE 在 WinSock 的意義是開啟太多的 socket 。這個程式通常發(fā)生在同一部機器中執(zhí)行過多的網(wǎng)路程式, 以致開啟過多的 socket 。另一種可以避免的錯誤是應用程式?jīng)]有正常的關閉不 用的 socket ,以致 socket 資源耗盡。WSAEWOULDBLOCK (10035) 函式作用阻攔中當函式作用是以非阻攔式進行, 而此刻的函式作用再返回時其函式作 用尚未完成的時候,就會出現(xiàn)這個錯誤。舉例

8、來說,假設 send() 以 非阻攔式傳送一段資料至遠端主機,假設函式返回時得到 WSAEWOULDBLOCK 這個錯誤,這樣表示這一段資料不能在這一 次的 send() 函式呼叫中傳送完。對于 connect() 函式,這個錯誤表示尚未成功地連接上遠端主機,連 接要求正在進行中。若你的程式中有利用 setsockopt() 函式以 SO_LINGER 設定時限,在呼叫 closesocket() 時有可能出現(xiàn)這個錯 誤。對于非同步的網(wǎng)路資料函式 ( WSAAsyncGetXXXXByYYYY() 而 言,得到 WSAEWOULDBLOCK 錯誤,表示要查詢的網(wǎng)路資料目前 無法取得。 這通常是

9、個暫時性的錯誤, 應用程式可能稍后再呼叫相同 的函式就會成功。WSAEINPROGRESS (10036) 有阻攔函式正在執(zhí)行中 對于每個 process 或 thread ,WinSock 只允許 ”一 ”個阻攔式函式 的執(zhí)行。如果已有阻攔式函式正在執(zhí)行, 而又呼叫到 WinSock 函式, 函式會傳回 WSAEINPROGRESS 的錯誤。這個錯誤也會發(fā)生在需要長執(zhí)行時間的函式,如 connect() 。有一種 情況是這樣:當執(zhí)行 ”非阻攔式 ”的 connect() 函式兩次,由于是非阻 攔式的 connect() ,第一次的呼叫傳回 WSAEWOULDBLOCK 錯誤 碼。此時要求連接

10、動作尚未完成,第二次的 connect() 呼叫就會得到 WSAEINPROGRESS 的錯誤。我們的建議是在有可能發(fā)生這種錯誤的函式呼叫前加上 WSAIsBlocking() 判斷是否有阻攔式函式正在執(zhí)行。 如果有的話, 我 們可能需要將正在進行的阻攔式函式取消掉, 或是將目前想要做的事 取消掉。WSAEALREADY (10037) 函式作用已完成這個錯誤的意思在柏克萊 socket 介面和 WinSock 函式的解釋上有 很大的差別。柏克萊 socket 介面的解釋是函式作用已完成;在Win Sock中,WSAEALREADY的意思是:”你想要取消的非同步事件已經(jīng)被取消了! ”,也就是當

11、你呼叫 WSACancelAsyncRequest() 試圖去取消一個非同步事件時,而該事件已被取消了。WSAENOTSOCK (10038) 非法的 socket通常 WinSock 函式都要以 socket 描述子當參數(shù)傳入,如果這個 socket 描述子所代表的 socket 不是正確開啟的或是根本沒有開啟, 函式就會得到 WSAENOTSOCK 錯誤。原則上,只要以 socket 描 述子當參數(shù)傳入的函式都有發(fā)生 WSAENOSOCK 錯誤的可能。WSAEDESTADDRREQ (10039) 需要對方位址當你要傳送資料給遠端機器,必須指定對方的位址 (和 port 等等 ), 才能正

12、確送達。檢查看看你的應用程式是否在呼叫 connect() 或 sendto() 時,正確地填入對方的 sockaddr 結(jié)構(gòu)。WSAEMSGSIZE (10040) 訊息太長,緩沖區(qū)無法容納 這個錯誤發(fā)生原因是由于訊息資料過大, 緩沖區(qū)無法容納, 這里的緩 沖區(qū)可能是使用者指定的或是系統(tǒng)內(nèi)部用的緩沖區(qū)。 會發(fā)生這個錯誤 的函式有四 : 函式錯誤發(fā)生的時機recv() 、 recvform()利用 datagram socket 接收資料時,如果 recv() 、 recvform() 指定 的緩沖區(qū)長度小于接收進來 datagram ,這時后過長的 datagram 會 被丟棄并告訴函式 W

13、SAEMSGSIZE 這個錯誤send() 、sendto()利用 datagram socket 傳送資料時,如果送出的資料緩沖區(qū)大于 WinSock 所能傳遞 datagram 的最大長度, 這時 send() 和 sendto() 傳回發(fā)生 WSAEMSGSIZ 這個錯誤訊息WSAEPROTOTYPE (10041) 錯誤的協(xié)定型別錯誤產(chǎn)生的原因是在 socket() 函式呼叫時指定了 WinSock 不支援的 協(xié)定舉例來說, 你不可以在 steam socket(SOCK_STREAM) 設定以 UDP 協(xié)定傳輸 (IPPRO_UDP) 。 stream socket 并不支援 UDP

14、 通訊 協(xié)定。如果你真的有心去測試的話,程式中故意如此呼叫socket():hSock=socket(AF_INETSOCK_STREAM ,IPPROTO_UDP); 你會發(fā)現(xiàn),這樣的 socket() 函式呼叫會得到 WSAEPROTONOSUPPORT 錯誤。這顯然不對,照理應該得到 WSAEPROTOTYPE 這個錯誤才對。 WSAEPROTOTYPE 這個錯 誤表示指定了錯誤的協(xié)定,而所指定的協(xié)定是該位址家族 (協(xié)定家族 ) 所支援的, 但不適用于 socket 型別。以上述的例子來看, UDP 協(xié)定 是屬于 AF_INET 這個位址家族,但是并不能用于 stream socket(

15、SOCK_STREAM socket) 上。 WSAEPROTONOSUPPORT 這個錯誤表示所指定的協(xié)定是該協(xié)定 家族所不支援的,意思上和 WSAEPROTOTYPE 有點出入。事實上, WSAEPROTOTYPE 和 WSAEPROTONOSUPPORT 之間 的差別是微乎其微的。 在發(fā)展網(wǎng)路程式的時候, 這兩種錯誤都是代表 著同一種狀況 -協(xié)定指定錯誤。總之,你永遠也沒辦法試出 WSAEPROTOTYPE 這個錯誤。WSAENOPROTOOPT (10042) 錯誤的協(xié)定選項 (option) 這個錯誤主要是針對 getsockopt() 和 setsockopt() 函式的。這兩個

16、函式可以以參數(shù)設定不同的選項而有不同的作用。 對于每個選項多多 少少會有些限制, 如有些選項只能用在 stream socket ,而有些只能 用在 datagram socket 。如果違反這些限制,就會發(fā)生這個錯誤。請看下表 :SO_DONTLINGERSO_KEEPALIVESO_LINGERSO_OOBINLINE不支援這些選項TCP_NODELAYdatagram socket ( SOCK_DGRAM )SO_DEBUGSO_DONTROUTESO_RCVBUFSO_SNDBUFTCP_NODELAY有些廠商的 WinSock TCP/IP 協(xié)定核心不支援這些選項SO_ACCEPT

17、CONNSO_ERRORSO_TYPE 這些選項只適用于 getsockopt() 函式,不能作用于 setsockopt() 函 式WSAEPROTONOSUPPORT (10043) 不支援的協(xié)定WinSock 協(xié)定核心不支援所指定的通訊協(xié)定。舉例來說當你用 socket() 函式時,第二個參數(shù)指定為 SOCK_STREAM ,第三個參數(shù) 指定為 IPPROTO_ICMP ,如此 socket() 呼叫會得到 WSAEPROTONOSUPPORT 這個錯誤。 WinSock 1 。1 版并不支 援 ICMP 協(xié)定,所以呼叫 socket() 指定 ICMP 這個協(xié)定,就會發(fā)生 錯誤。事實上

18、,產(chǎn)生 WSAEPROTONPSUPPORT 錯誤的狀況不只 這樣,詳見 WSAEPROTOTYPE 。WSAESOCKTNOSUPPORT (10044) 不支援的 socket 型別 目前使用的 WinSock 版本不支援函式所指定的 socket 型別。舉例 來說,完全根據(jù) WinSock 1.1 版的規(guī)格書發(fā)展的 WinSock 協(xié)定核 心,并不支援 SOCK_RAW 這個 socket 型別。在呼叫 socket() 函式 時,位址家族選 AF_INET( PF_INET ) 而 socket 型別選 SOCK_RAW 的話,就會發(fā)生這個錯誤。有些廠商發(fā)展的 WinSock 協(xié)定核心

19、除了支援 WinSock 1.1 版的規(guī) 格書所規(guī)范之外,還提供許多不同的功能。 我們建議您在發(fā)展程式時, 如果有必要用到這些額外的功能, 請好好考慮一下和其他環(huán)境相容性 的問題。WSAEOPNOTSUPP (10045) 作用函式不支援此類 socket 函式作用不支援目前 socket 型別。舉例來說, accept() 和 listen() 函式只能作用在連接導向的 socket(stream socket) ,也就是 stream socket 上。對于 recv() 、 recvform() 、 send() 和 sendto() 函式, MSG_OOB 也是只能用于連接導向的 so

20、cket 。WSAEPFNOSUPPORT (10046) 不支援的協(xié)定家族 目前的 WinSock 協(xié)定核心不支援所指定的協(xié)定家族。這個錯誤和WSAEAFNOSUPPORT 很像,目前這個錯誤被WSAEAFNOSUPPORT 所取代了,讀者可以參考 WSAEAFNOSUPPORT 說明部分。WSAEAFNOSUPPORT (10047) 不支援的位址家族使用協(xié)定不支援指定的位址家族。對于 socket() 函式,錯誤發(fā)生原 因是函式轉(zhuǎn)物錯誤的參數(shù)。 對于以 sockaddr 結(jié)構(gòu)為參數(shù)的函數(shù), 錯 誤發(fā)生的原因常是網(wǎng)路協(xié)定不支援 sockaddr 結(jié)構(gòu)中 (sin_family 成 員)指定

21、的位址家族。WSAEADDRINUSE (10048) 位址已被指定了所指定的 ”位址 ”正在使用中。這里的位址是指 socket 的名稱,包含 三部分:協(xié)定、 port 和 IP 位址。這個錯誤發(fā)生的原因通常是應用程 式試圖利用 bind() 函式去指定 port 時,此 port 已被其他應用程式所 占用了。這種情況發(fā)生于在同一部主機上執(zhí)行兩個相同性質(zhì)(指定相同 socket 名稱 ) 的 server 程式,第二的程式會因為第一個程式先占 用某個 port 而得到此錯誤訊息。還有一種常見的情況就是在撰寫 client 程式時,利用 bind() 去指定 socket 的 port ,此舉

22、常會有這個錯誤發(fā)生。并非不能用 bind() 去指 定 socket 的 port ,而是你無法確定程式執(zhí)行的時候, 所指定的 port 是否有其他程式正在使用。通常很少會在 client 程式中呼叫 bind() 函式,一般的 client 程式都是讓系統(tǒng)幫你選一個適當?shù)?port 。此外,應用程式可以利用 setsockopt() 的 SO_REUSEADDR 選項, 允許 port 可以重復使用,可是我們并不鼓勵這樣做。這樣可能會造 成 TCP/IP 核心在判斷應用程式上的困擾。WSAEADDRNOTAVAIL (10049) 無法指定位址 錯誤發(fā)生的原因通常是指定了該部機器不應該有的位

23、址。 這里的位址 包含三個部分:網(wǎng)路協(xié)定、 port 和 IP 位址。在柏克萊 socket 介面中,呼叫 bind() 時,若指定的 IP 位址不是本 地機器該有的位址, 就會出現(xiàn)這個錯誤。 在呼叫 connect() 或 sendto() 函式時,如果 sockaddr_in 結(jié)構(gòu)中的 sin_port 填 ”0”,如此也會導 致這個錯誤 (在 UNXI 上是 EADDRNOTAVAIL 錯誤 )。對于 WinSock 函式,錯誤發(fā)生的時機和柏克萊 socket 函式類似, bind() 和 connect() 都會導致這樣的錯誤。對于 WinSock 函式,錯誤發(fā)生的時機和柏克萊 soc

24、ket 函式類 似 ,bind() 和 connect() 都會導致這樣的錯誤。 WinSock 1.1 版的規(guī) 格書中并沒有提到 bind() 函式會導致 WSAEADDRNOTAVAIL 錯 誤,不過根據(jù)我們測試的結(jié)果, bind() 也會導致這樣的錯誤。WSAENETDOWN (10050) 網(wǎng)路出錯下層的網(wǎng)路系統(tǒng)發(fā)生問題, WinSock 函式無法執(zhí)行。這是一個相當 嚴重的問題,這會使得幾乎所有的 WinSock 函式呼叫失敗。若你的 WinSock 函式發(fā)生錯誤,那么請你該好好地檢查你的網(wǎng)路卡,網(wǎng)路 卡驅(qū)動程式和你的 WinSock 協(xié)定核心。WSAENETUNREACH (1005

25、1) 無法連上指定的網(wǎng)路在柏克萊 socket 介面中,這個錯誤的意思是無法和對方網(wǎng)路系統(tǒng)取 得聯(lián)系。在 WinSock 1 。1 規(guī)格中, WSAENETUNREACH 相通于 柏克萊 socket 介面中的 ETHOSTUNREACH 。WSAENETRESET (10052) 網(wǎng)路已被重新設定 對方主機出錯而重新開機。 在本地主機呼叫和傳送資料有關的函式就 會得到這個錯誤。對于 setsockopt() 函式,這個錯誤發(fā)生的原因在 于試圖設定 SO_KEEPALIVE 于逾時 (timeout) 的連接。WSAECONNABORTED (10053) 中斷連接在連接建立后,當有某種原因?qū)?/p>

26、致 TCP/IP 協(xié)定核心不斷地重送資料, 而且都重送失敗的時候, TCP/IP 協(xié)定將連接中斷。此時,應用程式 就會收到 WSACONNABORTED 這個錯誤。WSAECONNRESET (10054) 連結(jié)已被對方重新設定連結(jié)已被對方系統(tǒng)強迫中斷了。 TCP/IP 協(xié)定核心如果偵測出 stream socket 的連接發(fā)生問題的話,它會傳一個表示連接重設 (reset) 的訊息給對方。 此時對方程式會得到 WSAECONNRESET 的 錯誤訊息。WSAENOBUFS (10055) 緩沖區(qū)過小WinSock 核心無法配置足夠的緩沖區(qū),無法執(zhí)行該程式。這個錯誤 的發(fā)生和整個 Window

27、s 系統(tǒng)資源有關。 如果整個 Windows 本身可 用的資源就很少,所能同時執(zhí)行的程式也少。也有可能是執(zhí)行了 " 不 良"的應用程式,沒有正常的使用和歸還系統(tǒng)資源 (如記憶體 )?;蚴?某些應用程式的不正常關閉,也會占用系統(tǒng)資源。WSAEISCONN (10056) socket 已經(jīng)連接 網(wǎng)路函式通常會有一定的呼叫順序, 有的函式呼叫成功后便不能再呼叫,否則會出現(xiàn)錯誤。當連接建立時,client程式呼叫()成功,而server 程式呼叫 accept() 成功。此時若 client 程式再呼叫一次 connect() 函式的話, 會得到 WSAEISCONN 這個錯誤,

28、 表示該 socket 已經(jīng)處 于連接狀態(tài)了。如果 client 程式呼叫 listen() 函式的話也會出現(xiàn)這個 錯誤,表示不應該在此時呼叫這個函式。對于 server 程式,如果 socket 已經(jīng)處于連接狀態(tài),程式呼叫 connect() 函式的話,也會得 到 WSAEISCONN 這個錯誤。上述錯誤是發(fā)生在 stream socket 上,因為 stream socket 才會建 立連接。 對于 datagram socket ,多次成功的 connect() 函式呼叫是 被允許的 (對于 datdgram socket 而言,呼叫 connect() 函式的目的 不在于建立連接 )。

29、 datagram socket 發(fā)生此錯誤的原因是在 sendto() 函式上,當呼叫 sendto() 傳送 datagram 時,如果對方位 址填入 INADDR_ANY“( 0.0.0.0 ”)而 port 填入 0(在 sockaddr_in 結(jié) 構(gòu)中 ) ,就會導致 WSAEISCONN 這個錯誤。WSAENOTCONN (10057) socket 尚未連接 網(wǎng)路函式通常會有一定的呼叫順序, 有些函式必須先呼叫成功某函式 才能呼叫。 WSAENOTCONN 這個錯誤發(fā)生的原因很明顯,就是在 連接建立之前, 你試圖從連接對方取得資料或是傳送資料到對方, 就 會發(fā)生 WSAENETC

30、ONN 這個錯誤。舉例來說,對于 stream socket ,如果在建立連結(jié)前呼叫 send() 試 圖傳送資料,或者是呼叫 recv() 試圖取得資料,就會發(fā)生這個錯誤, 告訴你 socket 尚未建立連接。 你如果呼叫了 getpeername() 這個函 式試圖去取得連接對方的 socket ,當然也會出現(xiàn)這個錯誤。對于 setsockopt() 這個函式, 如果設定 SO_KEEPALIVE ,但連接已被中 斷的話,也會出現(xiàn) WSAENETCONN 這個錯誤。初學者可能在呼叫 connect() 函式之后沒有檢查是否函式呼叫錯誤, 以致不知道是否連接已正確建立。WSAESHUTDOW

31、N (10058) socket 已經(jīng)關閉這個錯誤碼的意思是,無法再傳送資料了,因為 socket 已經(jīng)經(jīng)由 shutdown() 函式而關閉了。當你利用 shutdown() 關閉 socket 之后, WinSock 的 TCP/IP 協(xié)定核心就會關閉這個 socket 的傳送或接收的 功能。有一點要注意的是,這個錯誤只會在 stream socket 出現(xiàn)。WSAETOOMANYREFS (10059) 參照 (reference) 太多,資源耗盡 在 UNIX 作業(yè)系統(tǒng)中的解釋是指系統(tǒng)核心資源消耗殆盡。不過在 WinSock 1.1 版的規(guī)格書中并沒有任何一個函式會發(fā)生這種錯誤。WSA

32、ETIMEDOUT (10060) 連接逾時 (timeout)當程式試圖利用 connect() 連接一臺遠端主機時, 此主機一直沒有回 應,經(jīng)過了一段時間后, TCP/IP 協(xié)定核心便會傳回 connect() 函式 WSAETIMEDOUT 這個錯誤訊息。發(fā)生這個錯誤的原因可能是程式 所要連接的遠端主機的系統(tǒng)發(fā)生問題, 或者根本沒有這一臺主機。 也 有一種可能的原因是本地機器的網(wǎng)路系統(tǒng)出現(xiàn)問題, 導致本地主機無 法正常與遠端主機聯(lián)系。 檢查你的網(wǎng)路系統(tǒng)的設定, 看看有什么不當 的地方,如閘道器 (gateway) 的設定, 主機名稱表 (hosts) 內(nèi)主機名稱 和網(wǎng)路位址的對照有錯誤等

33、等。WSAECONNREFUSED (10061) 連接受拒 連接要求受到對方機器的回絕, 無法和對方建立連接。 這個錯誤并不 是網(wǎng)路系統(tǒng)出了問題,而是對方機器的 server 程式拒絕 client 程式 的連接要求,或者是根本沒有這個 server 程式存在。當 TCP/IP 核 心收到某個連接要求時,會查看系統(tǒng)中是否有某 server 程式所監(jiān)聽 的 port 正好是這個連接要求所要連接的 port ,如果沒有此 server 程式,TCP/IP核心會回絕一個 WSAECONNREFUSED 給對方程式。通常發(fā)生這個錯誤的原因有幾個。 使用者可能連接到錯誤的遠端主機 或是錯誤的 port

34、 ,也有可能是遠端主機和 port 對了,但是 server 程式并沒有執(zhí)行。 檢查看看程式中的 sockaddr_in 結(jié)構(gòu)有沒有填錯 ? sockaddr_in 中的 IP 位址和 port 是不是以網(wǎng)路位元組順序排列。WSAELOOP (10062) 太多層的符號式鏈結(jié) (Symbolic link)在 UNIX 作業(yè)系統(tǒng)中,這個錯誤的意思是指路徑參考過多的符號式鏈 結(jié) (symbolic link) 。WSAENAMETOOLONG (10063) 檔名過長在 UNIX 作業(yè)系統(tǒng),這個錯誤的意思是指欲開啟檔案的路徑名稱(包括檔案名稱 )太長。WSAEHOSTDOWN (10064) 對

35、方主機關閉 在柏克萊 socket 介面的解釋中,這個錯誤發(fā)生的原因是當遠端主機關閉或系統(tǒng)出問題。WSAEHOSTUNREACH (10065) 無法聯(lián)系對方主機在柏克萊 socket 介面中,這個錯誤的意思是無法和對方主機取得聯(lián) 系。在 WinSock 方面,有類似的錯誤代碼,讀者可以參考 WSAENETUNREACH 這個錯誤的說明。WSAEPROCLIM (10067) Too many processes.A Windows Sockets implementation may have a limit on the number of applications that may us

36、e it simultaneously.WSAStartup() may fail with this error if the limit has been reached.WSASYSNOTREADY (10091) 主機網(wǎng)路系統(tǒng)尚未備妥本地主機的網(wǎng)路系統(tǒng)尚未能正常運作。 若發(fā)生這個錯誤, 讀者可能要 檢查一下有沒有 WINSOCK.DLL( 或 32 位元版本的 WSOCK32.DLL) 這個檔案 ? 這個檔存放的路徑正確嗎 ?WSAVERNOTSUPPORTED (10092) 不支援的 WinSock.DLL 版本 錯誤發(fā)生的原因是在呼叫 WSAStartup() 函式時所指定的 W

37、inSock 版本不被現(xiàn)有的 WinSock 版本所支援。若發(fā)生這個錯誤,讀者要確 定一下本地 Windows 系統(tǒng)中的 WinSock 版本和該版本所能支援的 版本是如何等等。 通常較新的版本同時能支援新舊版本的 WinSock , 建議讀者能使用較新的 WinSock 版本。WSANOTINITIALISED (10093) 未執(zhí)行 WSAStartup()應用程式?jīng)]有呼叫 WSAStartup() 或是呼叫 WSAStartup() 失敗。應 用程式要成功地呼叫 WSAStartup() 才能使用 WinSock.DLL ,否則 會有此錯誤訊息出現(xiàn)。WSAEDISCON (10101)

38、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 foundThe specified class was not found.WSAHOST_NOT_FOUND (11001) 已經(jīng)證實找不到主機 當你使用網(wǎng)路資料函式尋找主機的資料, 而該主機不存在時, 就會發(fā) 生這個錯誤。尋找網(wǎng)路主機

39、資料的方法通常是先尋找本地主機的網(wǎng)路 名稱表 (host 檔),如果找不到再透過 DNS 的途徑去找,如果再找不 到,通常就會回給函式這樣的錯誤。發(fā)生這樣的錯誤時,檢查看看本地主機的主機名稱解譯的設定有沒有 問題。比較可能出現(xiàn)問題的是 DNS 的設定,確定是不是設定錯誤的 DNS server 。如果 DNS server 正確,確定一下 DNS server 有沒 有跑起來。你可以利用 ping 這個程式看看 DNS server 有沒有跑起 來,如果沒有 ping 這個程式,你可以試著去解釋一個確定存在的主 機,看看 DNS server 有沒有在正常運作中。WSATRY_AGAIN (1

40、1002) 找不到網(wǎng)路資料,但未被證實 這是一個暫時性的錯誤, 告訴你目前找不到所要找的網(wǎng)路資料, 你可 以再試試看。WSANO_RECOVERY (11003) 無法挽救的錯誤對于查詢主機名稱而言,這個錯誤發(fā)生的原因是由網(wǎng)域名稱系統(tǒng) (Domain Name System, DNS) 所出現(xiàn)的錯誤所引起的。 這些錯誤包 括 DNS 的 FORMERR 、 REFUSED 和 NOTIMP 等錯誤,詳細請參 考 RFC1035 有關網(wǎng)域名稱系統(tǒng)的文件。對于查詢服務和協(xié)定資料而言, 這個錯誤發(fā)生的原因是找不到存放網(wǎng) 路資料的資料庫。這個資料庫通常是在本地主機上的檔案,如 SERVICES 和 P

41、ROTOCOL 這兩個檔。WSANO_DATA (11004) 名稱合法,但查無此資料查詢格式是正確的,但是查無此資料存在。這通常是暫時性的錯誤, 可能在不同的網(wǎng)路資料伺服器中能找到這份資料。WSAPROVIDERFAILEDINIT (OS dependent) Unable to initialize a service provider.Either a service provider's DLL could not be loaded(LoadLibrary() failed) or the provider'sWSPStartup/NSPStartup functi

42、on 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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論