簡體   English   中英

如何重復讀取套接字?

[英]How can I read from a socket repeatedly?

開始我用C#編碼。 我通過套接字將不同大小的數據寫入設備。 在寫入我想要從套接字讀取的數據之后,因為一旦完成處理所有數據,設備將回寫錯誤代碼/完成消息。 目前我有這樣的事情:

byte[] resultErrorCode = new byte[1];
resultErrorCode[0] = 255;

while (resultErrorCode[0] == 255)
{
    try
    {
        ReadFromSocket(ref resultErrorCode);
    }

    catch (Exception)
    {
    }
}
Console.WriteLine(ErrorList[resultErrorCode[0] - 48]);

我在其他地方使用ReadFromSocket ,所以我知道它工作正常。 最終發生的事情是我連接的端口(在我的機器上)更改為隨機端口。 我認為這會導致另一方的固件連接不良。 因此,當我在另一側寫入數據時,它會嘗試將數據寫入我連接的原始端口,但在嘗試多次讀取后,連接端口就會發生變化。

在收到完成命令之前,如何連續讀取套接字? 如果我知道循環有問題,因為對於我最小的測試文件,它需要1分13秒非常一致。 我通過刪除循環並將代碼置於休眠狀態1分15秒來測試代碼。 當它恢復時,它成功讀取了我期待的完成命令。 有人有建議嗎?

你應該擁有的是一個單獨的線程,它將像你的外部硬件的驅動程序。 該線程將接收所有數據,解析它並將適當的消息傳輸到應用程序的其余部分。 這部分代碼將讓您了解如何從硬件接收和解析數據。

  public void ContinuousReceive(){
    byte[] buffer = new byte[1024];
    bool terminationCodeReceived = false;
    while(!terminationCodeReceived){
      try{
          if(server.Receive(buffer)>0){
             // We got something
             // Parse the received data and check if the termination code
             // is received or not
          }
      }catch (SocketException e){
          Console.WriteLine("Oops! Something bad happened:" + e.Message);
      }
    }
  }

筆記:

  1. 如果要在計算機上打開特定端口(某些外部硬件配置為與預定義端口通信),則應在創建套接字時指定
  2. 在您想要停止應用程序或外部硬件API要求之前,切勿關閉套接字。 保持套接字打開將解決隨機端口更改
  3. 在處理外部硬件時使用Thread.Sleep並不是一個好主意。 如果可能,您應該使用事件(在RS232連接的情況下)或在單獨的線程上阻塞調用,如上面的代碼中的情況。

暫無
暫無

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

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