通过套接字编程在 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如果您需要在调用 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> 不起作用]的主要内容,如果未能解决你的问题,请参考以下文章