[通信協議] [Socket編程]WSAGetLastError()函數使用講解

一.前言        

       WSAGetLastError()函數爲我們進行socket編程時需要用到的一個函數。

二.講解

     1.函數的功能

  • WSAGetLastError()函數 

        int PASCAL FAR WSAGetLastError ( void );

       返回值指出了該線程進行的上一次Windows Sockets API函數調用時的錯誤代碼.這裏使用WSAGetLastError()函數來獲得上一次的錯誤代碼,而不是依靠全局錯誤變量, 是爲了提供和將來的多線程環境相兼容.

        注意在一個非佔先的Windows環境下,WSAGetLastError()只用來獲得Windows Sockets API錯誤.在佔先環境下,WSAGetLastError()將調用GetLastError(), 來獲得所有在每線程基礎上的Win32 API函數的錯誤狀態.爲提高可移植性,應用程序應在調用失敗後立即使用WSAGetLastError().

         返回值:

6 - WSA_INVALID_HANDLE

指定的事件對象無效。若使用與Win32函數對應的Winsock函數,便有可能產生這樣的Win32錯誤。它表明傳遞給WSAWaitForMultipleEvents的一個句柄是無效的。

8 - WSA_NOT_ENOUGH_MEMORY

內存不夠。這個Win32錯誤指出內存數量不足,無法完成指定的操作。

87 - WSA_INVALID_PARAMETER

一個或多個參數無效。這個Win32錯誤表明傳遞到函數內部的參數無效。假若事件計數參數無效,那麼在執行WSAWaitForMultipleEvents的時候,也會發生這樣的錯誤。

258 - WSA_WAIT_TIMEOUT

操作超時。這個Win32錯誤指出重疊I/O操作未在規定的時間內完成。

995 - WSA_OPERATION_ABORTED

重疊操作被取消。這個Win32錯誤指出由於套接字的關閉,造成一次重疊I/O操作的取消。

除此以外,該錯誤也可能在執行SIO_FLUSH這個I/O控制命令時出現。

996 - WSA_IO_INCOMPLETE

重疊I/O事件對象未處於傳信狀態。這個Win32錯誤也和重疊I/O操作密切相關,在調用WSAGetOverlappedResults函數的時候產生,指出重疊I/O操作尚未完成。

997 - WSA_IO_PENDING

重疊操作將在以後完成。用Winsock函數發出一次重疊I/O操作時,若出現這樣的Win32錯誤,便表明操作尚未完成,而且會在以後的某個時間完成。

10004 - WSAEINTR

函數調用中斷。該錯誤表明由於對WSACancelBlockingCall的調用,造成了一次調用被強行中斷。

10009 - WSAEBADF

文件句柄錯誤。該錯誤表明提供的文件句柄無效。在MicrosoftWindowsCE下,socket函數可能返回這個錯誤,表明共享串口處於“忙”狀態。

10013 - WSAEACCES

權限被拒。嘗試對套接字進行操作,但被禁止。若試圖在sendto或WSASendTo中使用一個廣播地址,但是尚未用setsockopt和SO_BROADCAST這兩個選項設置廣播權限,便會產生這類錯誤。

10014 - WSAEFAULT

地址無效。傳給Winsock函數的指針地址無效。若指定的緩衝區太小,也會產生這個錯誤。

10022 - WSAEINVAL

參數無效。指定了一個無效參數。例如,假如爲WSAIoctl調用指定了一個無效控制代碼,便會產生這個錯誤。另外,它也可能表明套接字當前的狀態有錯,例如在一個沒有監聽的套接字上調用accept或WSAAccept的時候。

10024 - WSAEMFILE

打開文件過多。提示打開的套接字太多了。通常,Microsoft提供者只受到系統內可用資源數量的限制。

10035 - WSAEWOULDBLOCK

資源暫時不可用。對非阻塞套接字來說,如果請求操作不能立即執行的話,通常會返回這個錯誤。比如說,在一個非阻塞套接字上調用connect,就會返回這個錯誤。因爲連接請求不能立即執行。

10036 - WSAEINPROGRESS

操作正在進行中。當前正在執行非鎖定操作。一般來說不會出現這個錯誤,除非正在開發16位Winsock應用程序。

10037 - WSAEALREADY

操作已完成。一般來說,在非鎖定套接字上嘗試已處於進程中的操作時,會產生這個錯誤。比如,在一個已處於連接進程的非鎖定套接字上,再一次調用connect或WSAConnect。

另外,服務提供者處於執行回調函數(針對支持回調例程的Winsock函數)的進程中時也會出現這個錯誤。

10038 - WSAENOTSOCK

無效套接字上的套接字操作。任何一個把SOCKET句柄當作參數的Winsock函數都會返回這個錯誤。它表明提供的套接字句柄無效。

10039 - WSAEDESTADDRREQ

需要目標地址。這個錯誤表明沒有提供具體地址。比方說,假如在調用sendto時,將目標地址設爲INADDR_ANY(任意地址),便會返回這個錯誤。

10040 - WSAEMSGSIZE

消息過長。這個錯誤的含義很多。如果在一個數據報套接字上發送一條消息,這條消息

對內部緩衝區而言太大的話,就會產生這個錯誤。再比如,由於網絡自身的限制,使一條消息過長,也會產生這個錯誤。最後,如果收到數據報之後,緩衝區太小,不能接收消息時,也會產生這個錯誤。

10041 - WSAEPROTOTYPE

套接字協議類型有誤。在socket或WSASocket調用中指定的協議不支持指定的套接字類型。

比如,要求建立SOCK_STREAM類型的一個IP套接字,同時指定協議爲IPPROTO_UDP,便會產生這樣的錯誤。

10042 - WSAENOPROTOOPT

協議選項錯誤。表明在getsockopt或setsockopt調用中,指定的套接字選項或級別不明、未獲支持或者無效。

10043 - WSAEPROTONOSUPPORT

不支持的協議。系統中沒有安裝請求的協議或沒有相應的實施方案。比如,如果系統中沒有安裝TCP/IP,而試着建立TCP或UDP套接字時,就會產生這個錯誤。

10044 - WSAESOCKTNOSUPPORT

不支持的套接字類型。對指定的地址家族來說,沒有相應的具體套接字類型支持。比如,在向一個不支持原始套接字的協議請求建立一個SOCK_RAW套接字類型時,就會產生這個錯誤。

10045 - WSAEOPNOTSUPP

不支持的操作。表明針對指定的對象,試圖採取的操作未獲支持。通常,如果試着在一

個不支持調用Winsock函數的套接字上調用了Winsock時,就會產生這個錯誤。比如,在一個數據報套接字上調用accept或WSAAccept函數時,就會產生這樣的錯誤。

10046 - WSAEPFNOSUPPORT

不支持的協議家族。請求的協議家族不存在,或系統內尚未安裝。多數情況下,這個錯誤可與WSAEAFNOSUPPORT互換(兩者等價);後者出現得更爲頻繁。

10047 - WSAEAFNOSUPPORT

地址家族不支持請求的操作。對套接字類型不支持的操作來說,在試着執行它時,就會出現這個錯誤。比如,在類型爲SOCK_STREAM的一個套接字上調用sendto或WSASendTo函數時,就會產生這個錯誤。另外,在調用socket或WSASocket函數的時候,若同時請求了一個無效的地址家族、套接字類型及協議組合,也會產生這個錯誤。

10048 - WSAEADDRINUSE

下地址正在使用。正常情況下,每個套接字只允許使用一個套接字地址(例如,一個IP套接字地址由本地IP地址及端口號組成)。這個錯誤一般和bind、connect和WSAConnect這三個函數有關。可在setsockopt函數中設置套接字選項SO_REUSEADDR,允許多個套接字訪問同一個本地IP地址及端口號。

10049 - WSAEADDRNOTAVAIL

不能分配請求的地址。API調用中指定的地址對那個函數來說無效時,就會產生這樣的錯誤。例如,若在bind調用中指定一個IP地址,但卻沒有對應的本地IP接口,便會產生這樣的錯誤。另外,通過connect、WSAConnect、sendto、WSASendTo和WSAJoinLeaf這四個函數爲準備連接的遠程計算機指定端口0時,也會產生這樣的錯誤。

10050 - WSAENETDOWN

網絡斷開。試圖採取一項操作時,卻發現網絡連接中斷。這可能是由於網絡堆棧的錯誤,網絡接口的故障,或者本地網絡的問題造成的。

10051 - WSAENETUNREACH

網絡不可抵達。試圖採取一項操作時,卻發現目標網絡不可抵達(不可訪問)。這意味着本地主機不知道如何抵達一個遠程主機。換言之,目前沒有已知的路由可抵達那個目標主機。

10052 - WSAENETRESET

網絡重設時斷開了連接。由於“保持活動”操作檢測到一個錯誤,造成網絡連接的中斷。

若在一個已經無效的連接之上,通過setsockopt函數設置SO_KEEPALIVE選項,也會出現這樣的錯誤。

10053 - WSAECONNABORTED

軟件造成連接取消。由於軟件錯誤,造成一個已經建立的連接被取消。典型情況下,這意味着連接是由於協議或超時錯誤而被取消的。

10054 - WSAECONNRESET

連接被對方重設。一個已經建立的連接被遠程主機強行關閉。若遠程主機上的進程異常中止運行(由於內存衝突或硬件故障),或者針對套接字執行了一次強行關閉,便會產生這樣的錯誤。針對強行關閉的情況,可用SO_LINGER套接字選項和setsockopt來配置一個套接字。

10055 - WSAENOBUFS

沒有緩衝區空間。由於系統缺少足夠的緩衝區空間,請求的操作不能執行。

10056 - WSAEISCONN

套接字已經連接。表明在一個已建立連接的套接字上,試圖再建立一個連接。要注意的是,數據報和數據流套接字均有可能出現這樣的錯誤。使用數據報套接字時,假如事先已通過connect或WSAConnect調用,爲數據報通信關聯了一個端點的地址,那麼以後試圖再次調用sendto或WSASendTo,便會產生這樣的錯誤。

10057 - WSAENOTCONN

套接字尚未連接。若在一個尚未建立連接的“面向連接”套接字上發出數據收發請求,便會產生這樣的錯誤。

10058 - WSAESHUTDOWN

套接字關閉後不能發送。表明已通過對shutdown的一次調用,部分關閉了套接字,但事後又請求進行數據的收發操作。要注意的是,這種錯誤只會在已經關閉的那個數據流動方向上纔會發生。舉個例子來說,完成數據發送後,若調用shutdown,那麼以後任何數據發送調用都會產生這樣的錯誤。

10060 - WSAETIMEDOUT

連接超時。若發出了一個連接請求,但經過規定的時間,遠程計算機仍未作出正確的響應(或根本沒有任何響應),便會發生這樣的錯誤。要想收到這樣的錯誤,通常需要先在套接字上設置好SO_SNDTIMEO和SO_RCVTIMEO選項,然後調用connect及WSAConnect函數。

要想了解在套接字上設置SO_SNDTIMEO和SO_RCVTIMEO選項的詳情,可參考第9章。

10061 - WSAECONNREFUSED

連接被拒。由於被目標機器拒絕,連接無法建立。這通常是由於在遠程機器上,沒有任何應用程序可在那個地址之上,爲連接提供服務。

10064 - WSAEHOSTDOWN

主機關閉。這個錯誤指出由於目標主機關閉,造成操作失敗。然而,應用程序此時更有可能收到的是一條WSAETIMEDOUT(連接超時)錯誤,因爲對方關機的情況通常是在試圖建立一個連接的時候發生的。

10065 - WSAEHOSTUNREACH

沒有到主機的路由。應用程序試圖訪問一個不可抵達的主機。該錯誤類似於WSAENETUNREACH。

10067 - WSAEPROCLIM

進程過多。有些Winsock服務提供者對能夠同時訪問它們的進程數量進行了限制。

10091 - WSASYSNOTREADY

網絡子系統不可用。調用WSAStartup時,若提供者不能正常工作(由於提供服務的基層系統不可用),便會返回這種錯誤。

10092 - WSAVERNOTSUPPORTED

Winsock.dll版本有誤。表明不支持請求的Winsock提供者版本。

10093 - WSANOTINITIALISED

Winsock尚未初始化。尚未成功完成對WSAStartup的一次調用。

10101 - WSAEDISCON

正在從容關閉。這個錯誤是由WSARecv和WSARecvFrom返回的,指出遠程主機已初始化了一次從容關閉操作。該錯誤是在像ATM這樣的“面向消息”協議上發生的。

10102 - WSAENOMORE

找不到更多的記錄。這個錯誤自WSALookupServiceNext函數返回,指出已經沒有留下更多的記錄。這個錯誤通常可與WSA_E_NO_MORE互換使用。在應用程序中,應同時檢查這個錯誤以及WSA_E_NO_MORE。

10103 - WSAECANCELLED

操作被取消。這個錯誤指出當WSALookupServiceNext調用仍在處理期間,發出了對WSALookupServiceEnd(服務中止)的一個調用。此時,WSALookupServiceNext便會返回這個錯誤。這個錯誤代碼可與WSA_E_CANCELLED互換使用。作爲應用程序,應同時檢查這個錯誤以及WSA_E_CANCELLED

10105 - WSAEINVALIDPROVIDER

無效的服務提供者。這個錯誤同服務提供者關聯在一起,在提供者不能建立正確的Winsock版本,從而無法正常工作的前提下產生。

10106 - WSAEPROVIDERFAILEDINIT

提供者初始化失敗。這個錯誤同服務提供者關聯在一起,通常見於提供者不能載入需要的DLL時。

10107 - WSASYSCALLFAILURE

系統調用失敗。表明絕對不應失敗的一個系統調用卻令人遺憾地失敗了。

10108 - WSASERVICE_NOT_FOUND

找不到這樣的服務。這個錯誤通常與註冊和名字解析函數相關,在查詢服務時產生(第10章對這些函數進行了詳盡解釋)。該錯誤表明,在給定的名字空間內,找不到請求的服務。

10109 - WSATYPE_NOT_FOUND

找不到類的類型。該錯誤也與註冊及名字解析函數關聯在一起,在處理服務類(Service Class)時發生。若註冊好一個服務的實例,它必須引用一個以前通過WSAInstallServiceClass安裝好的服務。

10110 - WSA_E_NO_MORE

找不到更多的記錄。這個錯誤是自WSALookupServiceNext調用返回的,指出已經沒有剩

下的記錄。該錯誤通常可與WSAENOMORE互換使用。作爲一個應用程序,應同時檢查這個

錯誤以及WSAENOMORE。

10111 - WSA_E_CANCELLED

操作被取消。該錯誤指出在對WSALookupServiceNext的調用尚未完成的時候,又發出了對WSALookupServiceEnd(中止服務)的一個調用。這樣,WSALookupServiceNext就會返回該錯誤。這個錯誤代碼可與WSAECANCELLED互換使用。作爲一個應用程序,應同時檢查這個錯誤以及WSAECANCELLED。

10112 - WSAEREFUSED

查詢被拒。由於被主動拒絕,所以一個數據庫查詢操作失敗。

11001 - WSAHOST_NOT_FOUND

主機沒有找到。這個錯誤是在調用gethostbyname和gethostbyaddr時產生的,表明沒有找到一個授權應答主機(AuthoritativeAnswerHost)。

11002 - WSATRY_AGAIN

非授權主機沒有找到。這個錯誤也是在調用gethostbyname和gethostbyaddr時產生的,表明沒有找到一個非授權主機,或者遇到了服務器故障。

11003 - WSANO_RECOVERY

遇到一個不可恢復的錯誤。這個錯誤也是在調用gethostbyname和gethostbyaddr時產生的,指出遇到一個不可恢復的錯誤,應再次嘗試操作。

11004 - WSANO_DATA

沒有找到請求類型的數據記錄。這個錯誤也是在調用gethostbyname和gethostbyaddr時產生的,指出儘管提供的名字有效,但卻沒有找到與請求類型對應的數據記錄。

11005 - WSA_QOS_RECEIVERS

至少有一條預約消息抵達。這個值同IP服務質量(QoS)有着密切的關係,其實並不是一個真正的“錯誤”(QoS的詳情見第12章)。它指出網絡上至少有一個進程希望接收QoS通信。

11006 - WSA_QOS_SENDERS

至少有一條路徑消息抵達。這個值同QoS關聯在一起,其實更像一種狀態報告消息。它指出在網絡上,至少有一個進程希望進行QoS數據的發送。

11007 - WSA_QOS_NO_SENDERS

沒有QoS發送者。這個值同QoS關聯在一起,指出不再有任何進程對QoS數據的發送有興趣。請參閱第12章,瞭解在發生這樣的錯誤時,對所發生情況的一系列完整說明。

11008 - WSA_QOS_NO_RECEIVERS

沒有QoS接收者。這個值同QoS關聯在一起,指出不再有任何進程對QoS數據的接收有興趣。請參閱第12章,查閱對這個錯誤的完整說明。

11009 - WSA_QOS_REQUEST_CONFIRMED

預約請求已被確認。QoS應用可事先發出請求,希望在批准了自己對網絡帶寬的預約請求後,收到通知。若發出了這樣的請求,一旦批准,便會收到這樣的消息。請參閱第12章,瞭解對此消息的詳細說明。

11010 - WSA_QOS_ADMISSION_FAILURE

缺乏資源致錯。資源不夠,以至於無法滿足QoS帶寬請求。

11011 - WSA_QOS_POLICY_FAILURE

證書無效。表明發出QoS預約請求的時候,要麼用戶並不具備正確的權限,要麼提供的證書無效。

11012 - WSA_QOS_BAD_STYLE

未知或衝突的樣式。QoS應用程序可針對一個指定的會話,建立不同的過濾器樣式。若出現這一錯誤,表明指定的樣式類型要麼未知,要麼存在衝突。請參閱第12章,瞭解對過濾器樣式的詳細說明。

11013 - WSA_QOS_BAD_OBJECT

無效的FILTERSPEC結構或者提供者特有對象。假如爲QoS對象提供的FILTERSPEC結構無效,或者提供者特有的緩衝區無效,便會返回這樣的錯誤,詳見第12章。

11014 - WSA_QOS_TRAFFIC_CTRL_ERROR

FLOWSPEC有問題。假如通信控制組件發現指定的FLOWSPEC參數存在問題(作爲QoS對象的一個成員傳遞),便會返回這樣的錯誤。

11015 - WSA_QOS_GENERIC_ERROR

 

  2.函數使用     

     ①.原型:

#include <winsock.h>
int PASCAL FAR WSAGetLastError ( void );

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章