C 區域網內socket通訊 TCP

2021-06-22 23:04:02 字數 1489 閱讀 8572

判斷對方正常斷開連線的方法:

這裡的正常斷開是指呼叫socket.shutdown(); socket.close();關閉socket的方法。此時,另一方的socket.receive();方法會返回0個位元組,即bytes = socket.receive();的bytes = 0;具體的寫法參照msdn,如下連線。

判斷對方非正常斷開:

採用異常捕獲的方式處理;

對於tcp的長連線來說,接受超時和傳送超時,二者預設的時間為0,意味著無限長時間等待,即阻塞。只能用於同步的長連線。

receivetimeout 和sendtimeout 預設值是0即無限期等待,說更改這個值就可以設定超時時間,設定超時檢測之後,系統會在超時之後自動將connected屬性設定為false,客戶端鏈結自動斷開,系統捕獲異常

socket.connect() 連線超時,是不能設定的;只能自己寫;

保證tcp連線一直有效:

1、socket.setsocketoption(socketoptionlevel.socket, socketoptionname.keepalive, true);

以下部分為引用於 《

那網路異常斷開原因主要有那些呢?歸納起來主要有以下兩種:

1、客戶端程式異常。

對於這種情況,我們很好處理,因為客戶端程式異常退出會在服務端引發connectionreset的socket異常(就是winsock2中的10054異常)。只要在服務端處理這個異常就可以了。

2、網路鏈路異常。

如:網線拔出、交換機掉電、客戶端機器掉電。當出現這些情況的時候服務端不會出現任何異常。這樣的話上面的**就不能處理這種情況了。對於這種情況在msdn裡面是這樣處理的,我在這裡貼出msdn的原文:

如果您需要確定連線的當前狀態,請進行非阻止、零位元組的 send 呼叫。如果該呼叫成功返回或引發 waewouldblock 錯誤** (10035),則該套接字仍然處於連線狀態;否則,該套接字不再處於連線狀態。

但是我在實際應用中發現,msdn說的這種處理方法在很多時候根本無效,無法檢測出網路已經異常斷開了。那我們該怎麼辦呢?

我們知道,tcp有乙個連線檢測機制,就是如果在指定的時間內(一般為2個小時)沒有資料傳送,會給對端傳送乙個keep-alive資料報,使用的序列號是曾經發出的最後乙個報文的最後乙個位元組的序列號,對端如果收到這個資料,回送乙個tcp的ack,確認這個位元組已經收到,這樣就知道此連線沒有被斷開。如果一段時間沒有收到對方的響應,會進行重試,重試幾次後,向對端發乙個reset,然後將連線斷掉。

socket會在keep-alive失敗後自動斷開並引發socket異常,所以你只要處理好socket異常就行了。

在windows中,第一次探測是在最後一次資料傳送的兩個小時,然後每隔1秒探測一次,一共探測5次,如果5次都沒有收到回應的話,就會斷開這個連線。但兩個小時對於我們的專案來說顯然太長了。我們必須縮短這個時間。

》2、使用心跳包

心跳包是最普遍也是最有效的方式之一。

客戶端每隔一段時間向服務端傳送乙個資料報,來證明自己的連線有效。

c 使用Socket實現區域網內通訊

using system using system.collections.generic using system.componentmodel using system.data using system.drawing using system.linq using system.net.so...

偵聽區域網內密碼

只需在前面的網路嗅探程式基礎上,新增對搜尋出的埠號進行的增加功能即可 如下 在decodeippacket中新增 switch ntohs ptcphdr destinationport break case80 case 8080 break void getftp char pdata.dwor...

偵聽區域網內密碼

只需在前面的網路嗅探程式基礎上,新增對搜尋出的埠號進行的增加功能即可 如下 在decodeippacket中新增 switch ntohs ptcphdr destinationport break case80 case 8080 break void getftp char pdata.dwor...