将2个字节的整数写入流中?

问题描述:

我试图通过使用简单协议的网络与应用程序进行交互。我不得不发送一个报头,看起来像这样:将2个字节的整数写入流中?

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

+0

将长度转换为'(short)length' – 2017-03-14 07:57:26

什么类型的流的是什么呢?如果它缓冲你的输入,数据可能永远不会通过线路发送。

编辑:

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

+0

这是一个指向字节数组的MemoryStream。 – 2009-08-26 05:10:33

+0

我认为就是这样。直接向WriteBytes指定{0,1}使得接收调用返回。现在唯一的问题是服务器没有发送任何数据。不过,我认为这不是这个代码的问题。 – 2009-08-26 05:46:53

我怀疑你需要把你的长度缩短。当你将int添加到流中时,我怀疑你只会得到前两个字节,因为int是4个字节,而你只写了两个到buf。

+0

不幸的是,将它改为short就不会做任何事情。我希望这很容易。:( – 2009-08-26 05:15:33

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

+0

目前,我只能在本地PC上运行服务器应用程序,Wireshark无法在本地主机上捕获数据包,我必须将数据发送到IP地址(本例中为127.0.0.1) t也支持回送适配器。 – 2009-08-26 05:44:37

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

我可以在这个代码想到的三个误差来源:

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