我正在尝试通过网络与使用简单协议的应用程序进行交互。我必须发送一个如下所示的标题:
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 :(得分: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)
我可以在这段代码中想到三个错误来源:
答案 4 :(得分:0)
我怀疑你需要缩短你的长度。当你将int转换为流时,我怀疑你只会获得前两个字节,因为int是4个字节,而你只是将其中两个写入buf。