我正在尝试通过网络与使用简单协议的应用程序进行交互。我必须发送一个看起来像这样的标头:

2个字节 =数据长度(包括请求类型)
1字节 =请求类型

我将两个参数都作为整数:

private static void WriteHeader(Stream buf, int length, int requestType) {
    buf.Write(BitConverter.GetBytes(length), 0, 2);
    buf.WriteByte((byte)requestType);
}

我这样称呼这样:

byte[] outBuf = new byte[256];
using (MemoryStream outStream = new MemoryStream(outBuf)) {
    // Socket connection stuff here
    WriteHeader(outStream, 1, 110);
    sock.Send(outBuf);
    // Receive stuff here, never returns
}

调用此方法或发送时,我没有任何例外 outBuf 在插座上,但是网络应用程序从未响应。不过,我可以使用其他程序进行查询,因此我可以肯定的是,这是因为我的标题没有正确编写。

我在编写价值时做错了吗?

编辑: 添加了MemoryStream代码

有帮助吗?

解决方案

这是什么类型的流?如果它可以缓冲输入,则数据可能永远不会在电线上发送。

编辑:

bitConverter.getBytes(1)给您[1,0,0,0],您从中传递[1,0]。也许这是一个终结性问题。尝试将[0,1]作为标题发送。

其他提示

您的客户和服务器之间是否存在Endian-ness问题?您可以尝试使用 Wireshark 或类似的工具,然后比较使用客户端发送/接收的数据包与成功通信的其他应用程序。

尝试网络流:

void WriteHeader(Stream s, int len, int cmd) {
    var buf = new byte[3];
    s.Write(BitConverter.GetBytes((UInt16)len));
    s.WriteByte((byte)cmd);
}

var ns = new NetworkStream(sock);
WriteHeader(ns, 1, 110);

我可以想到此代码中的三个错误来源:

  • Endianness问题:您发送的2个字节长度的字节顺序是什么,您确定GetBytes以正确的顺序提供字节?
  • 数据包大小:即使您的消息大小只有3个字节,您仍将发送256个字节数据。
  • 有效载荷:您没有在消息中输入任何有效负载,但是消息110可能需要其他数据。

我怀疑您需要简短的时间。当您将int播放到流时,我怀疑您只会获得前两个字节,因为int是4个字节,而您只将其中两个字节写给BUF。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top