题
我正在尝试通过网络与使用简单协议的应用程序进行交互。我必须发送一个看起来像这样的标头:
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。
不隶属于 StackOverflow