写一个2字节的整数到流?

时间:2009-08-26 05:07:23

标签: c# stream byte bitconverter

我正在尝试通过网络与使用简单协议的应用程序进行交互。我必须发送一个如下所示的标题:

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

5 个答案:

答案 0 :(得分:2)

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

编辑:

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

尝试使用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);

答案 3 :(得分:1)

我可以在这段代码中想到三个错误来源:

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

答案 4 :(得分:0)

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