【问题标题】:Writing a 2-byte integer to a stream?将 2 字节整数写入流?
【发布时间】:2010-11-22 21:03:36
【问题描述】:

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

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 代码

【问题讨论】:

  • 将长度转换为(short)length

标签: c# stream byte bitconverter


【解决方案1】:

它是什么类型的流?如果它缓冲您的输入,则数据可能永远不会真正通过网络发送。

编辑:

BitConverter.GetBytes(1) 为您提供 [1, 0, 0, 0],您从中传递 [1,0]。也许它是一个字节序问题。尝试发送 [0,1] 作为标题。

【讨论】:

  • 我想就是这样。将 { 0, 1 } 直接指定给 WriteBytes 会使接收调用返回。现在唯一的问题是服务器没有发送任何数据。不过,我认为这段代码没有问题。
【解决方案2】:

您的客户端和服务器之间是否存在字节顺序问题?你可以试试 使用Wireshark 或类似工具捕获网络流量,然后将使用您的客户端发送/接收的数据包与其他成功通信的应用程序进行比较。

【讨论】:

  • 目前,我只能在本地 PC 上运行服务器应用程序。 Wireshark 无法在 localhost 上捕获数据包。我必须将数据发送到一个 IP 地址(在本例中为 127.0.0.1),环回适配器也不支持该地址。
【解决方案3】:

试试 NetworkStream:

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

【讨论】:

    【解决方案4】:

    我能想到这段代码中的三个错误来源:

    • 字节序问题:您发送的 2 个字节长度的字节顺序是什么,您确定 GetBytes 以正确的顺序提供字节吗?
    • 数据包大小:您正在发送 256 个字节的数据,即使您的消息大小只有 3 个字节。
    • payload:您不会在消息中放入任何负载,但消息 110 可能需要额外的数据。

    【讨论】:

      【解决方案5】:

      我怀疑你需要缩短你的长度。当您将 int 写入流时,我怀疑您只会获得前两个字节,因为 int 是 4 个字节,而您只将其中两个写入 buf。

      【讨论】:

      • 不幸的是,将其更改为 short 没有任何作用。我希望这很容易。 :(
      猜你喜欢
      • 1970-01-01
      • 2015-10-03
      • 2011-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-22
      • 2013-06-08
      相关资源
      最近更新 更多