如何重复读取套接字?

首先,我在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秒非常一致。 我已经通过删除循环并将代码置于hibernate状态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连接的情况下)或在单独的线程上阻塞调用,如上面的代码中的情况。