[英]problems with TCP clients and sockets
背景:我的應用程序可以選擇自動檢查網絡上的設備是否已連接到網絡。
如果未連接設備,則將其表示為藍色正方形,並以綠色正方形表示已連接。 我已經對該程序進行了相當全面的測試,並查看了一些不同的數據集。
如果設備從斷開連接開始,我可以連接,然后斷開連接,該連接從藍色變為綠色,然后變為藍色,但此后停止運行。
如果設備開始連接,我可以斷開連接,但不能再連接,因此從綠色變為藍色,然后停止運行。
這是一些代碼片段,以顯示我如何與它們連接(這不是異步的,因為某些設備沒有回調(?));
TcpClient _tc = new TcpClient();
if (!_tc.Client.Connected)
{
try
{
_tc.Client.Connect(device.deviceIPAddress, device.devicePort);
_tc.Client.ReceiveTimeout = 10;
}
catch
{
if (deviceDownNotified == false)
{
//do stuff to notify me
}
}
}
if (_tc.Client.Connected)
{
tcpSet = true;
try
{
result = this.SendCommandResult(bData, 72);
if (result[0] == 0xF0 && result[1] == 0xF0 && result[2] == 0x00 && result[3] == 0x02 && result[68] == 0xF0 && result[69] == 0xF0)
{
CheckChanges(result, device, exit);
deviceDownNotified = false;
}
}
catch
{
}
}
編輯:也是我只是在想,有時候我真的不需要任何手動斷開連接。 如果客戶端未連接,則進行連接,如果已連接,則進行處理。 我對它一次在狀態之間切換並停止工作感到困惑。
我認為我的問題可能是由於如果設備斷開連接,我斷開套接字/客戶端的方式引起的。 有人有想法么? 如果您需要更多信息,請詢問。
編輯2:我連接了一個重新連接按鈕,該按鈕在應重新連接時手動單擊,並且出現以下錯誤異常:
“一旦套接字斷開連接,您只能再次異步重新連接,並且只能重新連接到另一個EndPoint。必須在不會完成操作的情況下退出的線程上調用BeginConnect。”
解決了我自己的問題。 最后。 這是供任何閱讀此書的人的信息,他們可能正在尋找解決方案。
從我收集到的信息來看,當TCP連接中斷時,您必須創建一個新連接,因為無法以這種方式重新連接或重用。 我所做的是:
(根據我的問題的代碼修改)
if (!_tc.Connected)
{
try
{
connect2(deviceIPAddress, devicePort);
}
catch
{
if (deviceDownNotified == false)
{
((ListBox)mainUI.Controls["lbLog"]).InvokeEx(f => ((ListBox)mainUI.Controls["lbLog"]).Items.Add("device " + device.deviceDescription + " down at " + System.DateTime.Now));
(mainUI.Controls["btn" + device.deviceButtonNumber]).BackgroundImage = null;
(mainUI.Controls["btn" + device.deviceButtonNumber]).BackColor = Color.Blue;
deviceDownNotified = true;
try
{
_tc = new TcpClient();
initialPoll = false;
MessageBox.Show("here");
}
catch (Exception error)
{
MessageBox.Show(error.Message);
}
}
}
}
在這里,我只是簡單地創建了一個同名的新tcplistener(我的原始tcplistener是一個類實例的變量(繞口令),創建這個新的TCP實例,然后設置我的inialPoll變量可使一切恢復正常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.