c# - 如何重复读取套接字?

标签 c# sockets

首先,我使用 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 连接的情况下)或在单独的线程上阻止调用,就像上面代码中的情况一样。

关于c# - 如何重复读取套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11269291/

相关文章:

c# - C#存储对List <T>的引用

c# - 取消任务队列中正在执行的任务

c# - SignalR 和 Redis : SocketFailure on EVAL

C:使用 select() 写入新客户端

C++ - 套接字和多线程

sockets - 枚举耗尽 TCP 端口的 AD 组和成员的脚本

c# - MySQL 在 C# 中以编程方式触发

c# - C# 中使用 while(true) 的内存问题

python - 在两个Python脚本之间连续发送数据

php - 将数据从 C++ 程序发送到 PHP Web 服务器