5

我正在向设备发送字节数组的请求,并且我想接收设备提供的 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[]'

我该如何解决?

谢谢。

4

6 回答 6

6

正如错误告诉使用 byte[]

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

另请参阅

于 2009-09-02T08:33:30.280 回答
1

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] );
}

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

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

于 2009-09-02T08:43:26.000 回答
1

我会这样解决它:

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 个数组,因此使用了更多内存!

于 2010-11-09T13:47:40.093 回答
0

如果您需要在致电 Receive 之前充当列表,您还可以使用:

  deviceSocket.Receive(coming.ToArray());
于 2009-09-02T08:44:09.650 回答
0
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 函数不能与 List<> 兼容。

对不起,迟到的答案,我试图让他们:)

于 2009-09-02T11:02:06.813 回答
0

试试这个:

foreach (item in coming)
{
    xtxtComing.Text += $"a {item} ";
}
于 2021-12-13T22:23:27.160 回答