導航:首頁 > 編程系統 > linuxsocket客戶端關閉

linuxsocket客戶端關閉

發布時間:2023-03-27 22:04:11

1. 如何正確關掉socket

所以要用長連接埃客戶端埠關閉後需要在close_wait狀態等待1-2分鍾才會徹底關閉,具體看操作系統的設置,一般默認2分鍾。詳細TCP狀態轉換可以參考TCP協議。如果預期需要頻繁傳數據,就不要關閉埠,而是維持埠連接

2. 如何優雅地關閉一個socket

1. 關閉Socket時究竟做了什麼
關閉socket分為主動關閉(Active closure)和被動關閉(Passive closure)兩種情況。前者是指有本地主機主動發起的關閉;而後者則是指本地主機檢測到遠程主機發起關閉之後,作出回應,從而關閉整個連接。
其狀態圖如下圖所示:

起初每個socket都是CLOSED狀態,當客戶端初使化一個連接,他發送一個SYN包到伺服器,客戶端進入SYN_SENT狀態。
伺服器接收到SYN包,反饋一個SYN-ACK包,客戶端接收後返饋一個ACK包客戶端變成ESTABLISHED狀態,如果長時間沒收到SYN-ACK包,客戶端超時進入CLOSED狀態。
當伺服器綁定並監聽某一埠時,socket的狀態是LISTEN,當客戶企圖建立連接時,伺服器收到一個SYN包,並反饋SYN-ACK包。伺服器狀態變成SYN_RCVD,當客戶端發送一個ACK包時,伺服器socket變成ESTABLISHED狀態。

當一個程序在ESTABLISHED狀態時有兩種圖徑關閉它, 第一是主動關閉,第二是被動關閉。如果你要主動關閉的話,發送一個FIN包。當你的程序closesocket或者shutdown(標記),你的程序發送一個FIN包到peer,你的socket變成FIN_WAIT_1狀態。peer反饋一個ACK包,你的socket進入FIN_WAIT_2狀態。如果peer也在關閉連接,那麼它將發送一個FIN包到你的電腦,你反饋一個ACK包,並轉成TIME_WAIT狀態。
TIME_WAIT狀態又號2MSL等待狀態。MSL意思是最大段生命周期(Maximum Segment Lifetime)表明一個包存在於網路上到被丟棄之間的時間。每個IP包有一個TTL(time_to_live),當它減到0時則包被丟棄。每個路由器使TTL減一並且傳送該包。當一個程序進入TIME_WAIT狀態時,他有2個MSL的時間,這個充許TCP重發最後的ACK,萬一最後的ACK丟失了,使得FIN被重新傳輸。在2MSL等待狀態完成後,socket進入CLOSED狀態。
被動關閉:當程序收到一個FIN包從peer,並反饋一個ACK包,於是程序的socket轉入CLOSE_WAIT狀態。因為peer已經關閉了,所以不能發任何消息了。但程序還可以。要關閉連接,程序自已發送給自已FIN,使程序的TCP socket狀態變成LAST_ACK狀態,當程序從peer收到ACK包時,程序進入CLOSED狀態。

2. Winsock2 API中的相關函數
先當然是查MSDN,看到winsocks2 API中的相關函數有:closesocket,shutdown,WSASendDisconnect. 我大致說一下,具體詳細的資料還請自行查MSDN.
int closesocket( SOCKET s)的作用是關閉指定的socket,並且回收其所有的資源。
int shutdown( SOCKET s, int how)則是禁止在指定的socket s上禁止進行由how指定的操作,但並不對資源進行回收,shutdown之後而closesocket之前s還不能再次connect或者WSAConnect.
int WSASendDisconnect( SOCKET s, LPWSABUF lpOutboundDisconnectData)則和shutdown基本類似,稍有不同的就是WSASendDisconnect函數多了一個lpOutboundDisconnectData參數,可以允許發送「斷開數據」(disconnect data).但MSDN上寫了「The native implementation of TCP/IP on Windows does not support disconnect data.」,所以一般我們就用shutdown函數就行了。

3. Socket的優雅關閉
在MSDN中對shutdown函數中的Remarks部分有下面一段話,指出了如何進行一次優雅的slcket關閉:
To assure that all data is sent and received on a connected socket before it is closed, an application should use shutdown to close connection before calling closesocket. For example, to initiate a graceful disconnect:

Call WSAAsyncSelect to register for FD_CLOSE notification.
Call shutdown with how=SD_SEND.
When FD_CLOSE received, call recv until zero returned, or SOCKET_ERROR.
Call closesocket.
closesocket的行為也是隨setsockopt()中參數的不同而有不同的表現,這里影響它的行為的主要就是那個linger結構。

SO_DONTLINGER 若為真,則SO_LINGER選項被禁止。
SO_LINGER 延遲關閉連接 struct linger
上面這兩個選項影響close行為
選項 間隔 關閉方式 等待關閉與否
SO_DONTLINGER 不關心 優雅 否
SO_LINGER 零 強制 否
SO_LINGER 非零 優雅 是
若設置了SO_LINGER(亦即linger結構中的l_onoff域設為非零),並設置了零超時間隔,則closesocket()不被阻塞立即執行,不論是否有排隊數據未發送或未被確認。這種關閉方式稱為「強制」或「失效」關閉,因為套介面的虛電路立即被復位,且丟失了未發送的數據。在遠端的recv()調用將以WSAECONNRESET出錯。
若設置了SO_LINGER並確定了非零的超時間隔,則closesocket()調用阻塞進程,直到所剩數據發送完畢或超時。這種關閉稱為「優雅的」關閉。請注意如果套介面置為非阻塞且SO_LINGER設為非零超時,則closesocket()調用將以WSAEWOULDBLOCK錯誤返回。
若在一個流類套介面上設置了SO_DONTLINGER(也就是說將linger結構的l_onoff域設為零),則closesocket()調用立即返回。但是,如果可能,排隊的數據將在套介面關閉前發送。請注意,在這種情況下WINDOWS套介面實現將在一段不確定的時間內保留套介面以及其他資源,這對於想用所以套介面的應用程序來說有一定影響。
所以一般來說,不應該把linger設置為SO_LINGER 並且設置timeout為0,這樣的話,當本地主機調用closesocket時將會造成一個「強制」或「失效」的非優雅關閉。可以根據實際情況設置為另外兩種情況。

3. linux下socket創建後,進程退出是否需要主動調用close關閉

進程退出 必須要父進程進行回收 要不然會產生孤兒進程造成資源浪費。也會對系統產生影響。推薦ibm出的unix環境高級編程 或者鳥哥的linux私房菜。linux跟unix差不多。希望能幫到你

4. 如何判斷對端關閉了socket

1. 根據ERRNO和recv結果進行判斷
在UNIX/LINUX下,非阻塞模式SOCKET可以採用recv+MSG_PEEK的方式進行判斷,其中MSG_PEEK保證了僅僅進行狀態判斷,而不影響數據接收
對於主動關閉的SOCKET, recv返回-1,而且errno被置為9(#define EBADF 9 /* Bad file number */)或104 (#define ECONNRESET 104 /* Connection reset by peer */)
對於被動關閉的SOCKET,recv返回0,而且errno被置為11(#define EWOULDBLOCK EAGAIN /* Operation would block */)
對正常的SOCKET, 如果有接收數據,則返回>0, 否則返回-1,而且errno被置為11(#define EWOULDBLOCK EAGAIN /* Operation would block */)

因此對於簡單的狀態判斷(不過多考慮異常情況):
recv返回>0, 正常

5. 如何使用linux命令關閉一個socket

在linux的網路編程抄,特別是TCP的編程中,SIGPIPE信號錯誤是一個比較常見的問題,我猜測你是在使用TCP的socket吧,如果是這樣的話,很有可能是你在向一個已經處於關閉狀態的socket寫數據,因為TCP是面向連接的協議。如果對方將socket給close掉了,而你還繼續往這個socket寫數據,就會觸發這個信號。因此,建議你在write之前檢查一下對方是否已經close掉了這個socket。如果回答得不對,可以繼續追問哈

閱讀全文

與linuxsocket客戶端關閉相關的資料

熱點內容
maya粒子表達式教程 瀏覽:84
抖音小視頻如何掛app 瀏覽:283
cad怎麼設置替補文件 瀏覽:790
win10啟動文件是空的 瀏覽:397
jk網站有哪些 瀏覽:134
學編程和3d哪個更好 瀏覽:932
win10移動硬碟文件無法打開 瀏覽:385
文件名是亂碼還刪不掉 瀏覽:643
蘋果鍵盤怎麼打開任務管理器 瀏覽:437
手機桌面文件名字大全 瀏覽:334
tplink默認無線密碼是多少 瀏覽:33
ipaddgm文件 瀏覽:99
lua語言編程用哪個平台 瀏覽:272
政采雲如何導出pdf投標文件 瀏覽:529
php獲取postjson數據 瀏覽:551
javatimetask 瀏覽:16
編程的話要什麼證件 瀏覽:94
錢脈通微信多開 瀏覽:878
中學生學編程哪個培訓機構好 瀏覽:852
榮耀路由TV設置文件共享錯誤 瀏覽:525

友情鏈接