将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的代码
什么类型的流的是什么呢?如果它缓冲你的输入,数据可能永远不会通过线路发送。
编辑:
BitConverter.GetBytes(1)给你[1,0,0,0],从中要传递[1,0]。也许它是一个排序问题。尝试发送[0,1]作为标题。
这是一个指向字节数组的MemoryStream。 – 2009-08-26 05:10:33
我认为就是这样。直接向WriteBytes指定{0,1}使得接收调用返回。现在唯一的问题是服务器没有发送任何数据。不过,我认为这不是这个代码的问题。 – 2009-08-26 05:46:53
我怀疑你需要把你的长度缩短。当你将int添加到流中时,我怀疑你只会得到前两个字节,因为int是4个字节,而你只写了两个到buf。
不幸的是,将它改为short就不会做任何事情。我希望这很容易。:( – 2009-08-26 05:15:33
您的客户端和服务器之间是否存在端到端问题?您可以尝试 使用Wireshark或类似工具捕获网络流量,然后比较使用您的客户端发送/接收的数据包与其他成功通信的其他应用程序的数据包。
目前,我只能在本地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可能需要附加数据。
将长度转换为'(short)length' – 2017-03-14 07:57:26