【问题标题】:Dynamic Byte Array in C# by Socket Programming [List<byte> does not work]通过套接字编程在 C# 中使用动态字节数组 [List<byte> 不起作用]
【发布时间】:2010-11-24 21:15:13
【问题描述】:

我正在向设备发送字节数组的请求,我想接收设备提供的 anwser。

...
Socket deviceSocket = new Socket(server);
List<byte> coming = new List<byte>();
...
deviceSocket.Receive(coming)

这里程序给出错误: 错误 1
'System.Net.Sockets.Socket.Receive(byte[])' 的最佳重载方法匹配有一些无效参数 错误 2
参数“1”:无法从“System.Collections.Generic.List”转换为“byte[]”

我该如何解决?

谢谢。

【问题讨论】:

    标签: c# arrays dynamic sockets byte


    【解决方案1】:

    因为错误告诉使用字节[]

    Socket deviceSocket = new Socket(server);
    byte[] coming = new byte[buffersize];
    ...
    deviceSocket.Receive(coming)
    

    另见this

    【讨论】:

      【解决方案2】:

      Socket.Receive() 方法将使用尽可能多的数据填充 缓冲区,或者尽可能多的可用数据,以较低者为准。

      如果您知道所有消息都在 2048 字节以下,那么您可以按如下方式声明您的缓冲区:

      byte[] buffer = new byte[2048];
      int bytesReceived = 0;
      // ... somewhere later, getting data from client ...
      bytesReceived = deviceSocket.Receive( buffer );
      Debug.WriteLine( String.Format( "{0} bytes received", bytesReceived ) );
      // now process the 'bytesReceived' bytes in the buffer
      for( int i = 0; i < bytesReceived; i++ )
      {
          Debug.WriteLine( buffer[i] );
      }
      

      当然,您可能想做的不仅仅是将字节写入调试输出,但您明白了 :)

      您仍然需要注意,您可能会收到不完整的数据,如果客户端将消息分成多个数据包,那么一个可能会通过(并被接收)然后另一个。有某种方式告诉服务器期望有多少数据总是好的,然后它可以在处理之前组装完整的消息。

      【讨论】:

      • 客户端 [我项目中的设备] 以不同的长度发送不同的请求答案。我收到带有 CRC 字节的数据,因此我可以理解答案是否损坏。谢谢你的回答,我明白了:)
      • 您的消息中是否包含已知的“终结者”?例如\0x00,如果是这样,那么您可以继续接收到您的缓冲区,并将缓冲区的内容处理为 List 直到您获得此终止符,缓冲区中剩余的任何内容都是另一条消息的一部分。
      • 不,我接收的消息不包含任何终止符,而且它们的长度不同,我的工作确实需要一个动态字节数组。最后更糟糕的情况是设置一个长的静态数组。这对我有害,因为我应该为即将到来的消息编写一个分析算法。我只知道我的请求的回答长度......
      【解决方案3】:

      如果您需要在调用 Receive 之前充当列表,您也可以使用:

        deviceSocket.Receive(coming.ToArray());
      

      【讨论】:

      • 好点,我可能已经匆忙回答,并没有看为什么 Recieve 方法首先需要一个数组。此解决方案将创建一个与列表内容相同但您以后无法访问的新数组。最好的解决方案是创建一个临时数组或最初使用一个数组,如 PoweRoy 的回答。
      • 很抱歉,coming.ToArray() 必须分配给另一个数组
      【解决方案4】:
      byte[] coming = new byte[8];
      deviceSocket.Receive(coming);
      for (int i = 0; i < 8; i++)
      {
          xtxtComing.Text += coming[i].ToString() + " ";
      }
      

      上面的代码在我的监听循环中工作 [xtxtComing 是一个文本框!

      列表来了不会因为遵守而给出任何错误。

                          List<byte> coming1 = new List<byte>();
                          deviceSocket.Receive(coming1.ToArray());
                          for (int i = 0; i < coming1.ToArray().Length; i++)
                          {
                              xtxtComing.Text += "a " + coming1[i].ToString() + " ";
                          }
      

      上面的这些代码在同一个循环中不起作用,我无法在 xtxtComing 中得到任何东西 文本框。也许我有语法错误,或者我认为 Receive 函数不能使用 列表兼容。

      对不起,回复晚了,我已经尝试过:)

      【讨论】:

        【解决方案5】:

        我会这样解决:

        int bytesRead = 0;
        byte[] incomming = new byte[1024];
        byte[] trimmed;
        
        try
        {
            bytesRead = sTcp.Read(incomming , 0, 1024);
            trimmed = new byte[bytesRead];
        
            Array.Copy(incomming , trimmed , bytesRead);
        }
        catch
        {
            return;
        }
        

        但要提醒一下,您实际上创建了 2 个数组,因此使用了更多内存!

        【讨论】:

          【解决方案6】:

          试试这个:

          foreach (item in coming)
          {
              xtxtComing.Text += $"a {item} ";
          }
          

          【讨论】:

          • 请添加更多细节。例如,什么是“即将到来”以及您在 foreach 中尝试做什么。
          • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-04-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多