簡體   English   中英

TCP客戶端和套接字的問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM