常見(jiàn)socket錯(cuò)誤返回碼_第1頁(yè)
常見(jiàn)socket錯(cuò)誤返回碼_第2頁(yè)
常見(jiàn)socket錯(cuò)誤返回碼_第3頁(yè)
已閱讀5頁(yè),還剩24頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

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

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

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

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

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

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

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

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

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

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

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

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

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

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

15、SOCK_STREAM socket) 上。 WSAEPROTONOSUPPORT 這個(gè)錯(cuò)誤表示所指定的協(xié)定是該協(xié)定 家族所不支援的,意思上和 WSAEPROTOTYPE 有點(diǎn)出入。事實(shí)上, WSAEPROTOTYPE 和 WSAEPROTONOSUPPORT 之間 的差別是微乎其微的。 在發(fā)展網(wǎng)路程式的時(shí)候, 這兩種錯(cuò)誤都是代表 著同一種狀況 -協(xié)定指定錯(cuò)誤??傊阌肋h(yuǎn)也沒(méi)辦法試出 WSAEPROTOTYPE 這個(gè)錯(cuò)誤。WSAENOPROTOOPT (10042) 錯(cuò)誤的協(xié)定選項(xiàng) (option) 這個(gè)錯(cuò)誤主要是針對(duì) getsockopt() 和 setsockopt() 函式的。這兩個(gè)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

35、方主機(jī)關(guān)閉 在柏克萊 socket 介面的解釋中,這個(gè)錯(cuò)誤發(fā)生的原因是當(dāng)遠(yuǎn)端主機(jī)關(guān)閉或系統(tǒng)出問(wèn)題。WSAEHOSTUNREACH (10065) 無(wú)法聯(lián)系對(duì)方主機(jī)在柏克萊 socket 介面中,這個(gè)錯(cuò)誤的意思是無(wú)法和對(duì)方主機(jī)取得聯(lián) 系。在 WinSock 方面,有類(lèi)似的錯(cuò)誤代碼,讀者可以參考 WSAENETUNREACH 這個(gè)錯(cuò)誤的說(shuō)明。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) 主機(jī)網(wǎng)路系統(tǒng)尚未備妥本地主機(jī)的網(wǎng)路系統(tǒng)尚未能正常運(yùn)作。 若發(fā)生這個(gè)錯(cuò)誤, 讀者可能要 檢查一下有沒(méi)有 WINSOCK.DLL( 或 32 位元版本的 WSOCK32.DLL) 這個(gè)檔案 ? 這個(gè)檔存放的路徑正確嗎 ?WSAVERNOTSUPPORTED (10092) 不支援的 WinSock.DLL 版本 錯(cuò)誤發(fā)生的原因是在呼叫 WSAStartup() 函式時(shí)所指定的 W

37、inSock 版本不被現(xiàn)有的 WinSock 版本所支援。若發(fā)生這個(gè)錯(cuò)誤,讀者要確 定一下本地 Windows 系統(tǒng)中的 WinSock 版本和該版本所能支援的 版本是如何等等。 通常較新的版本同時(shí)能支援新舊版本的 WinSock , 建議讀者能使用較新的 WinSock 版本。WSANOTINITIALISED (10093) 未執(zhí)行 WSAStartup()應(yīng)用程式?jīng)]有呼叫 WSAStartup() 或是呼叫 WSAStartup() 失敗。應(yīng) 用程式要成功地呼叫 WSAStartup() 才能使用 WinSock.DLL ,否則 會(huì)有此錯(cuò)誤訊息出現(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)證實(shí)找不到主機(jī) 當(dāng)你使用網(wǎng)路資料函式尋找主機(jī)的資料, 而該主機(jī)不存在時(shí), 就會(huì)發(fā) 生這個(gè)錯(cuò)誤。尋找網(wǎng)路主機(jī)

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

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

41、ROTOCOL 這兩個(gè)檔。WSANO_DATA (11004) 名稱(chēng)合法,但查無(wú)此資料查詢(xún)格式是正確的,但是查無(wú)此資料存在。這通常是暫時(shí)性的錯(cuò)誤, 可能在不同的網(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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論