1. 程式人生 > >[Visual Studio C++][Socket程式設計] WSAGetLastError()函式使用講解

[Visual Studio C++][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 );