通过套接字编程在 C# 中使用动态字节数组 [List<byte> 不起作用]

Posted

技术标签:

【中文标题】通过套接字编程在 C# 中使用动态字节数组 [List<byte> 不起作用]【英文标题】:Dynamic Byte Array in C# by Socket Programming [List<byte> does not work] 【发布时间】: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[]”

我该如何解决?

谢谢。

【问题讨论】:

【参考方案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。

以上是关于通过套接字编程在 C# 中使用动态字节数组 [List<byte> 不起作用]的主要内容,如果未能解决你的问题,请参考以下文章

通过套接字从 C++ wchar_t 到 C# char

套接字编程/通过无线发送二进制图像数据

如何通过引用从 c# 到 c++ 传递字节数组

Java套接字在写入字节数组后仅获得NUL字符

将 HICON / HCURSOR 复制到字节数组中

网络上的 C# 列表与字节数组效率