TCP斷開連線情況判斷(傳送端沒有任何資訊告知現在狀態的情況下)
阿新 • • 發佈:2019-01-26
上一章可以接收資料顯示了,使用中發現,第2次連線時,出現毫無反應的現象,
故障排查,想著是不是要斷開連線,沒有關閉的緣故,
後來覺的不傳送資料了並不是說就要斷開連線,
並且資料傳送段沒有任何資訊告訴我啥時候是連著沒資料(暫停),啥時候是不連線了(關閉),
所以,想通過以接收的資料是不是0判斷就不行了,
最後的思路是:執行後我開啟一個後臺執行緒時刻監聽是否有連線請求,收到請求就建立一個執行緒,去接收處理資料,
再收到一個請求就把上一個執行緒殺死,執行下一個執行緒。(如果不是在一個死迴圈裡,執行緒長久不使用了,會被清理的,不過我需要寫在死迴圈裡,所以要手動殺死)
整理的程式碼如下:
/// <summary>
/// 初始化連線
/// </summary>
public void initBack()
{
//定義偵聽埠,偵聽任何IP
ipEnd = new IPEndPoint(IPAddress.Any, 5300);
//定義套接字型別,在主執行緒中定義
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//連線
serverSocket.Bind(ipEnd);
//開始偵聽,最大10個連線
serverSocket.Listen(10);
//開啟一個執行緒連線,必須的,否則主執行緒卡死
Thread thread = new Thread(Listen);
thread.Start(serverSocket);
}
/// <summary>
/// 監聽連線
/// </summary>
Thread lastThread = null ;
void Listen( )
{
while (true)
{
clientSocket = serverSocket.Accept();
countSocket++;
if (clientSocket != null)
{
Thread th = new Thread(A);
th.IsBackground = true;
if (lastThread != null)
{
lastThread.Abort();
}
th.Start();
lastThread = th;
}
}
}
void A()
{
while (true)
{
ReceiveBack();
}
}
這樣就可以了