簡體   English   中英

套接字編程中的套接字超時

[英]socket time out in socket programming

我的硬件比臨時網絡中的筆記本電腦(服務器)要多。

服務器單獨發送數據時,它可以正常工作。 並且客戶端單獨發送數據,也可以正常工作。

但是,當服務器和客戶端一起發送數據時,經過一段時間,就會發生超時。

35,有時33包之后將發生超時。

我更改了硬件的傳輸速率,但也斷開了連接。

盡管硬件支持全雙工。

超時后,我對硬件執行ping操作,但它不在端口上。

並檢查服務器上的端口,它是開放的。

我能怎么做?

byte[] bytes = new byte[512];
        //try
        //{

            IPHostEntry ipHost = Dns.GetHostEntry("");
            // Gets first IP address associated with a localhost 
            IPAddress add = ipHost.AddressList[3];


            TcpListener tcpListener = new TcpListener(add, 6000);
            tcpListener.Start();



            TcpClient tcpClient = tcpListener.AcceptTcpClient();


            NetworkStream stream = tcpClient.GetStream();

            String data = null;
            while (true)
            {
                int j = 0;
                int i;
                while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
                {
                    j = j + 1;
                    // Translate data bytes to a ASCII string.
                    data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
                    AddItem("j="+j+" Received:"+ data);

                    // Process the data sent by the client.
                    //data = data.ToUpper();

                    byte[] msg = System.Text.Encoding.ASCII.GetBytes("thanks");

                    // Send back a response.
                    stream.Write(msg, 0, msg.Length);
                    AddItem("Sent:"+"thanks");


                }
                // Shutdown and end connection
                tcpClient.Close();

標准套接字調用都處於阻塞狀態,因此,如果兩個參與者都在相互發送消息,則他們各自等待對方接收他們發送的消息,從而導致死鎖

在.NET中,有三種典型的解決方案:

  • Microsoft具有用於異步套接字活動的並行API。 它比您的示例需要更多的開銷代碼,但幾乎以類似於Windows的方式處理所有內容。
  • 在使用Socket.Select()編寫之前,可以通過測試可讀數據來自己處理異步活動。 這是一種典型的輪詢方法,但是您需要自己做所有事情,並且需要確保沒有飢餓或其他偏見。
  • 將您的ReadWrite代碼放在不同的線程中,以便阻塞一個線程不會阻塞整個程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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