Windows 套接字詳解、 值,和的含義

1.在connect成功建⽴立鏈接以後設置該選項:linger m_sLinger; m_sLinger.l_onoff = 1;  // (在closesocket()調⽤用,可是還有數據沒發送完畢的時候允許逗留)m_sLinger.l_linger = 0; // (允許逗留的時間爲0秒)setsockopt(sockConnected,         SOL_SOCKET,         SO_LINGER,          (const char*)&m_sLinger,         sizeof(linger)); 總結 也許咱們避免不了CLOSE_WAIT狀態凍結的再次出現,但咱們會使影響降到最⼩小,但願那個重⽤用套接字選項可以使得下⼀一次從新建⽴立鏈接時能夠把CLOSE_WAIT狀態踢掉數據庫

當使用TCP套接字時,當無網絡鏈接時,還會繼續send,繼續recv阻塞,知道TCP本身協議機制判斷斷開鏈接時纔會中止發送和接收,時間須要幾分鐘之久。 解決的辦法是,本身設置接收超時時間,當超時後從新發送,或者重新初始化socket而後在從新建立socket從新connect。 代碼以下:
int iSendTimeout, iRecvTimeOut; iClientSock = socket(AF_INET, SOCK_STREAM, 0); if(iClientSock < 0) { printf("[%s:%d]client init error\r\n", FILE, LINE); return ERROR; }api

iRecvTimeOut = 3000;        
    iRet1 = setsockopt(iClientSock, SOL_SOCKET, SO_RCVTIMEO, &iRecvTimeOut, sizeof(int));
    printf("%s\r\n", strerror(errno));
    iSendTimeout = 3000;        
    iRet2 = setsockopt(iClientSock, SOL_SOCKET, SO_SNDTIMEO, (char *)&iSendTimeout, sizeof(int));
    printf("%s\r\n", strerror(errno));

可是編譯會出錯,perror顯示參數錯誤(Invalid argument ),看了下內核中的實現,參數確實錯了,其中最後一個參數是sizeof(struct timeval) 類型的,而非其餘類型 改正爲: struct timeval tv; //聲明一個 struct timeval 類型的變量 而後最後個參數寫爲: iRet2=setsockopt(iClientSock, SOL_SOCKET, SO_SNDTIMEO, &iSendTimeout, sizeof(tv));服務器

參數解析: int setsockopt(int s, int level, int optname,const void *optval, socklen_t optlen); 1)int s :sockfd,即socket文件描述符 2)int level : SOL_SOCKET(通用套接字) ,IPPROTO_TCP,等 3) int optname :SO_SNDTIMEO(發送超時時間)|SO_RSVTIMEO(接收超時時間)等,設置選項, 4) const void *optval :自定義的超時時間的地址 5) struct timeval的大小,即sizeof(struct timecal)網絡

sockConnected = socket(AF_INET, SOCK_STREAM, 0);以後,咱們要設置該套接字的選項來重⽤用:/// 容許重⽤用本地地址和端⼝口: /// 這樣的好處是,即便socket斷了,調⽤用前⾯面的socket函數也不會佔⽤用另⼀一個,⽽而是始終就是⼀一個端⼝口/// 這樣防⽌止socket始終鏈接不上,那麼按照原來的作法,會不斷地換端⼝口。 int nREUSEADDR = 1;setsockopt(sockConnected,SOL_SOCKET, SO_REUSEADDR,(const char*)&nREUSEADDR, sizeof(int));app

WSAEINTR (10004)異步

轉換 : 中斷函數調用。
說明 : 阻止的操做已被對 WSACancelBlockingCall (Wsapiref_704y.asp) 的調用中斷。

WSAEACCES (10013)socket

轉換 : 被拒絕的權限。
說明 : 一個試圖訪問已禁止其訪問權限的套接字。 是例如此錯誤時發生了廣播的地址用於 Sendto 但廣播權限不經過 setsockopt(SO_BROADCAST) 設置的。 WSAEACCES 錯誤的另外一個可能緣由是,綁定 (Wsapiref_6vzm.asp) 函數調用時 (在 Microsoft Windows NT 4.0 Service Pack 4 [SP 4] 或更高版本),另外一個程序、 服務或內核模式驅動程序綁定到以獨佔訪問相同的地址。 獨佔訪問是一項新功能的 Windows NT 4.0 SP 4 及更高版本中,並它實現使用 SO_EXCLUSIVEADDRUSE 選項。

WSAEFAULT (10014)函數

轉換 : 錯誤的地址。
說明 : 嘗試使用調用的一個指針參數時 </a0>-系統檢測到無效指針地址。 若是程序傳遞了無效的指針值,或者若是緩衝區的長度過小會發生此錯誤。 是例如若是 SOCKADDR 結構的參數的長度小於 sizeof(SOCKADDR) 值,則會出現此問題。

WSAEINVAL (10022)操作系統

轉換 : 無效的參數。
說明 : 一個無效參數 (而是例如的參數指定了無效的級別) 提供給 setsockopt (Wsapiref_94aa.asp) 函數。 有時,它還引用此套接字的當前狀態,調用套接字未偵聽上接受 (Wsapiref_13aq.asp) 的是例如。

WSAEMFILE (10024)線程

轉換 : 打開的文件太多。
說明 : 有太多打開的套接字。 每一個實現可能會有可用的套接字處理一個最大數量。 這些句柄可能全局,每進程,或每線程。

WSAEWOULDBLOCK (10035)

轉換 : 資源暫時不可用。
說明 : 此返回錯誤沒法完成的當即,是例如 nonblocking 套接字操做 recv (Wsapiref_2i9e.asp),無數據排隊從套接字讀取時。 一個非致命的錯誤和操做能夠稍後重試。 WSAEWOULDBLOCK 一般報告爲已調用的結果 nonblocking SOCK_STREAM 套接字鏈接 (Wsapiref_8m7m.asp),由於一些時間必須通過創建鏈接。

WSAEINPROGRESS (10036)

轉換 : 正在進行的操做。
說明 : 阻止操做當前正在運行。 Windows 套接字僅容許一次的阻止操做,爲每一個任務或每一個線程爲未完成。 若是 (不管它引用或任何其餘套接字) 進行任何其餘函數調用,則操做將失敗 WSAEINPROGRESS 錯誤。

WSAEALREADY (10037)

轉換 : 已在進行的操做。
說明 : 已進行的操做後,嘗試一個操做 nonblocking 套接字上。 是例如電話鏈接 (Wsapiref_8m7m.asp) 一個 nonblocking 套接字已鏈接的嘗試第二次的或異步請求 (WSAAsyncGetXbyY) 曾已取消或完成。

WSAENOTSOCK (10038)

轉換 : 套 nonsocket 操做。
說明 : 一個操做已嘗試在不套接字的。 套接字句柄參數引用一個有效的套接字,或者選擇 (Wsapiref_1ab6.asp),一個 fd_set 的成員是無效。

WSAEDESTADDRREQ (10039)

轉換 : 所需的目標地址。
說明 : 從套接字上的操做中省略一個所需的地址時。 是例如若是 Sendto (Wsapiref_4sqa.asp) 的遠程地址 ADDR_ANY 調用將返回此錯誤。

WSAEMSGSIZE (10040)

轉換 : 郵件太長。
說明 : 發送數據報套接字上的一封郵件大於內部消息緩衝區或其餘一些網絡限制或者用於接收數據報的緩衝區比其自身數據報小。

WSAEPROTOTYPE (10041)

轉換 : 協議的套接字的錯誤類型。
說明 : 套接字 (Wsapiref_2qr6.asp) 函數調用中指定一個協議不支持請求的套接字類型的語義。 是例如 SOCK_STREAM 套接字類型不能指定 ARPA Internet UDP 協議。

WSAENOPROTOOPT (10042)

轉換 : 錯誤的協議選項。
說明 : getsockopt (Wsapiref_8qcy.asp) 調用或 setsockopt (Wsapiref_94aa.asp) 調用中指定一個未知、 無效,或不支持選項或級別。

WSAEPROTONOSUPPORT (10043)

轉換 : 不支持的協議。
說明 : 程序請求的協議沒或者被配置爲在系統中,或者沒有實現爲其存在。 例如,套接字 (Wsapiref_2qr6.asp) 調用請求 SOCK_DGRAM 套接字,但它指定一個流協議。

WSAESOCKTNOSUPPORT (10044)

轉換 : 套類型不受支持。
說明 : </a0>-支持指定的套接字類型不在此地址系列。 是例如 SOCK_RAW 可選類型能夠選擇在套接字 (Wsapiref_2qr6.asp) 調用,但實現根本不支持 SOCK_RAW 套接字。

WSAEOPNOTSUPP (10045)

轉換 : 不支持的操做。
說明 : 已嘗試該操做不支持引用的對象的類型。 到不支持此操做的套接字的套接字描述符試圖接受數據報套接字上的鏈接時一般出現此錯誤。

WSAEPFNOSUPPORT (10046)

轉換 : 協議系列不受支持。
說明 : The 協議家族還沒有配置系統中,或者沒有實現爲其存在。 此郵件有從 WSAEAFNOSUPPORT 某種稍有不一樣的含義。 可是,是常常互換。 返回這些消息之一的全部 Windows 套接字功能還都指定 WSAEAFNOSUPPORT。

WSAEAFNOSUPPORT (10047)

轉換 : 地址家族不受協議系列。
說明 : 使用一個與請求的協議不兼容的地址。 全部的套接字建立具備一個關聯的地址族 (這就是對 Internet 協議的 AF_INET) 和泛型的協議類型 (這就是 SOCK_STREAM)。 若是套接字 (Wsapiref_2qr6.asp) 調用顯式請求的不正確的協議,或者 Sendto (Wsapiref_4sqa.asp) 中在錯誤的系列地址使用的一個的套接字是例如,將返回此錯誤。

WSAEADDRINUSE (10048)

轉換 : 已在使用中的地址。
說明 : 容許每一個套接字地址 (協議 / IP 地址 / 端口) 的只有一個使用的一般。 若是某個程序試圖綁定 Wsapiref_6vzm.asp 到一個 IP 地址或端口已被使用的一個現有的套接字套接字未正確,關閉套接字就會發生此錯誤或套接字的仍在過程結束。 對於綁定到相同的端口號的多個套接字的服務器程序請考慮使用 Setsockopt (Wsapiref_94aa.asp)(SO_REUSEADDR)。 客戶端程序一般沒有在調用綁定、 鏈接 (Wsapiref_8m7m.asp) 自動選擇一個未使用的端口。 綁定調用使用通配符地址 (包括 ADDR_ANY) 時, 提交特定地址以前可能延遲了 WSAEADDRINUSE 錯誤。 這可能會出現更高版本,包括鏈接、 偵聽、 WSAConnect 或 WSAJoinLeaf 的另外一個函數調用。

WSAEADDRNOTAVAIL (10049)

轉換 : 沒法分配請求的地址。
說明 : The 請求的地址是其上下文中的無效。 此錯誤一般到本地計算機的無效地址致使試圖綁定 (Wsapiref_6vzm.asp)。 此錯誤也致使從鏈接 (Wsapiref_8m7m.asp),Sendto (Wsapiref_4sqa.asp),WSAConnect (Wsapiref_8kc2.asp)、 WSAJoinLeaf (Wsapiref_7dv6.asp) 或 WSASendTo (Wsapiref_752q.asp) 若是遠程地址或端口爲遠程計算機 (for example,地址或端口 0) 的無效。

WSAENETDOWN (10050)

轉換 : 網絡已關閉。
說明 : A 套接字操做遇到死的網絡。 此錯誤可能表示網絡系統 (這就是該協議堆棧上運行的 Windows 套接字 DLL 的)、 網絡界面或本地網絡自己在嚴重發生故障。

WSAENETUNREACH (10051)

轉換 : 網絡不可訪問。
說明 : A 套接字操做嘗試一個沒法訪問網絡。 此錯誤一般表示本地軟件知道到達遠程主機沒有路由。

WSAENETRESET (10052)

轉換 : 網絡上重置丟棄鏈接。
說明 : The 鏈接中斷因爲的在操做過程當中檢測到錯誤的保持鏈接活動。 它能夠也由返回 setsockopt (Wsapiref_94aa.asp) 若是試圖對已失敗的鏈接設置 SO_KEEPALIVE。

WSAECONNABORTED (10053)

轉換 : 軟件致使鏈接暫停。
說明 : 一個創建的鏈接中止您的主機該軟件可能會因數據傳輸超時或協議錯誤。

WSAECONNRESET (10054)

轉換 : 經過對等方重置的鏈接。
說明 : 一個現有的鏈接被遠程主機強制關閉。 若是遠程主機上的對等程序忽然中止、 主機從新啓動或遠程主機使用硬盤的關閉則,一般會發生此錯誤。 有關詳細信息,有關遠程套接字上 SO_LINGER 選項,請參閱 Setsockopt (Wsapiref_94aa.asp)。 若是因爲的正在進行一個或多個操做時檢測到錯誤的保持鏈接活動的鏈接已斷開,也可能會致使此錯誤。 在進行的操做失敗,並 WSAENETRESET。 隨後的操做失敗,出現 WSAECONNRESET。

WSAENOBUFS (10055)

轉換 : 無可用的緩衝區空間。
說明 : 因爲系統缺乏緩衝區空間不足或隊列已滿,沒法執行套接字上的一個操做。

WSAEISCONN (10056)

轉換 : 套接字已鏈接。
說明 : 一個已鏈接的套接字上發出一個鏈接請求。 若是 Sendto (Wsapiref_4sqa.asp) 調用鏈接 SOCK_DGRAM 套接字上某些實現也返回此錯誤 (爲 SOCK_STREAM 套接字,在 Sendto 中參數 (Wsapiref_4sqa.asp) 將被忽略) 儘管其餘實現將此視爲有效的事件。

WSAENOTCONN (10057)

轉換 : 套接字未鏈接。
說明 : 由於套接字未鏈接而且 (發送數據報套接字使用 Sendto [Wsapiref_4sqa.asp] 上時, 沒有地址提供),不容許一個請求發送或接收數據。 任何其餘類型的操做也可能會返回此錯誤,例如若是鏈接重置設置 SO_KEEPALIVE setsockopt (Wsapiref_94aa.asp)。

WSAESHUTDOWN (10058)

轉換 : 套接字關閉後沒法發送。
說明 : 由於套接字必須已被關閉在該方向上一個關閉 (Wsapiref_60z6.asp) 調用一個請求發送或接收數據時不容許。 關閉調用時, 請求的套接字的部分關閉。 這是已中止發送或接收進程 (或二者) 的信號。

WSAETIMEDOUT (10060)

轉換 : 鏈接超時。
說明 : 因爲鏈接的方沒有不正確響應時間,一段時間後或創建的鏈接失敗,由於響應失敗的鏈接的主機 A 的鏈接嘗試失敗。

WSAECONNREFUSED (10061)

轉換 : 鏈接被拒絕。
說明 : 無鏈接可創建,由於目標計算機積極地拒絕。 此錯誤一般致使嘗試鏈接處處於非活動狀態這就是指沒有服務器程序運行在外部主機上的服務。

WSAEHOSTDOWN (10064)

轉換 : 主機已關閉。
說明 : A 的套接字操做失敗,由於目標主機已關閉。 套接字操做遇到死主機。 本地主機的網絡活動已被初始化。 這些狀況更有可能由錯誤 WSAETIMEDOUT。

WSAEHOSTUNREACH (10065)

轉換 : 無路由主機。
說明 : A 套接字操做已嘗試到沒法訪問主機。 請參閱 WSAENETUNREACH。

WSAEPROCLIM (10067)

轉換 : 太多進程。
說明 : 一個 Windows 套接字實現可能會限制的程序,可使用在同一時間數。 若是在達到該限制,WSAStartup (Wsapiref_1v8y.asp) 可能會所以錯誤。

WSASYSNOTREADY (10091)

轉換 : 網絡子系統不可用。
說明 : 若是 Windows 套接字實現當前沒法工做,由於它用來提供網絡服務的基礎系統當前不可用的 WSAStartup (Wsapiref_1v8y.asp) 會返回此錯誤。 確認如下幾點:
    請確認相應的 Windows 套接字 DLL 文件位於當前路徑。
    請確認它們沒有試圖在同一時間使用多個 Windows 套接字實現。
    若是有多個 Winsock DLL 在系統上,請確認路徑中第一個的 Winsock DLL 是適用於當前加載網絡子系統。
    確認全部必需的組件是當前安裝並正確配置根據爲 Windows 套接字實現文檔。

WSAVERNOTSUPPORTED (10092)

轉換 : Winsock.dll 版本出範圍。
說明 : The 當前的 Windows 套接字實現不支持 Windows 套接字規範版本請求程序。 請確保訪問任何舊的 Windows 套接字 DLL 文件。

WSANOTINITIALISED (10093)

轉換 : 成功 WSAStartup 還沒有執行。
說明 : Either 程序具備不稱爲 WSAStartup (Wsapiref_1v8y.asp) 或 WSAStartup (Wsapiref_1v8y.asp) 失敗。 該程序可能正在訪問套接字不擁有當前的活動任務 (這就正在嘗試進行共享的任務之間套接字),或 WSACleanup 已調用屢次。

WSAEDISCON (10101)

轉換 : 正在正常關閉。
說明 : 由 WSARecv (Wsapiref_4z1u.asp) 和 WSARecvFrom (Wsapiref_4wky.asp),指示遠程方已啓動正常的關閉序列中返回此錯誤。

WSATYPE_NOT_FOUND (10109)

轉換 : 類找不到的類型。
說明 : 找不到程序指定的類。

WSAHOST_NOT_FOUND (11001)

轉換 : 找不到主機。 不稱爲任何這樣的主機。
說明 : </a0>-名不是正式的主機名或別名,或它沒法找到正在查詢的數據庫中。 此錯誤可能還返回爲協議和服務查詢,而且這意味着在相關數據庫中沒法找到指定的名稱。

WSATRY_AGAIN (11002)

轉換 : 找不到非受權主機。
說明 : 此錯誤是一般在臨時錯誤主機名稱解析,期間,它意味着本地服務器從權威服務器是否未收到響應。 在稍後某個時間重試可能成功。

WSANO_RECOVERY (11003)

轉換 : 這是一個 nonrecoverable 的錯誤。
說明 : 此錯誤表示某種 nonrecoverable 錯誤發生在數據庫查找。 若是找不到數據庫文件 (是例如 BSD 兼容 HOSTS、 SERVICES 或協議文件),或者若是 DNS 請求返回了一個嚴重錯誤服務器,可能會出現此錯誤。

WSANO_DATA (11004)

轉換 : 有效的名稱、 請求類型的任何數據記錄。
說明 : 程序請求的名稱是有效但中找到在的數據庫,但它沒有正確的解決的它的相關的數據。 爲此,典型示例是對主機名稱到地址轉換嘗試 (使用 gethostbyname [Wsapiref_0q5u.asp] 或 WSAAsyncGetHostByName [Wsapiref_7bhu.asp]) 使用 DNS 服務器。 但沒有 A 記錄,則返回的 MX 記錄。 這指示其自身主機存在,但不是直接可到達。

WSA_INVALID_HANDLE (依賴於操做系統)

轉換 : 指定事件對象句柄無效。
說明 : 一個程序試圖使用 Event 對象,可是指定的句柄是無效。

WSA_INVALID_PARAMETER (依賴於操做系統)

轉換 : 一個或多個參數是無效。
說明 : 一個程序使用一個 Windows 套接字函數,直接將映射到 Win 32 函數。 Win 32 函數指示一個或多個參數有問題。

WSA_IO_INCOMPLETE (依賴於操做系統)

轉換 : 重疊的 I / O 事件對象不在信號狀態。
說明 : The 程序已嘗試肯定還沒有完成的重疊操做的狀態。 在操做完成以前,肯定重疊的操做完成的時間在輪詢模式下使用 WSAGetOverlappedResult (帶有 fwait 標誌集爲 FALSE) 的程序收到此錯誤代碼。

WSA_IO_PENDING (依賴於操做系統)

轉換 : 重疊的操做將在之後完成。
說明 : The 程序已開始的重疊的操做,沒法當即完成的。 在操做完成時,將更高版本發送完成指示。

WSA_NOT_ENOUGH_MEMORY (依賴於操做系統)

轉換 : 不足的內存。
說明 : 一個程序使用一個 Windows 套接字函數,直接將映射到 Win 32 函數。 Win 32 函數指示所需的內存資源不足。

WSA_OPERATION_ABORTED (依賴於操做系統)

轉換 : 覆蓋操做被終止。
說明 : 因爲套接字已關閉,或 WSAIoctl (Wsapiref_6ik2.asp) 中的 SIO_FLUSH 命令已運行,出現重疊的操做被取消。

WSAINVALIDPROCTABLE (依賴於操做系統)

轉換 : 無效的過程表服務提供商。
說明 : 服務提供程序返回到 Ws2_32.dll 的一個無效的過程表。 (這是一般所致一個或多個在空的函數指針)。

WSAINVALIDPROVIDER (依賴於操做系統)

轉換 : 無效的服務提供程序的版本號。
說明 : 服務提供程序返回之外 2.0 的版本號。

WSAPROVIDERFAILEDINIT (依賴於操做系統)

轉換 : 沒法初始化服務提供程序。
說明 : Either 服務提供商的 DLL 沒法加載 (LoadLibrary 失敗),或提供程序的 WSPStartup / NSPStartup 函數失敗。

WSASYSCALLFAILURE (依賴於操做系統)

轉換 : 系統調用失敗。
說明 : 永遠不會將失敗的系統調用失敗時,將返回此錯誤。 是例如若是對 WaitForMultipleObjects 的調用失敗,或者其中一個註冊表函數失敗嘗試更改協議或名稱空間目錄,則會發生此錯誤。
相關文章
相關標籤/搜索