0

我正在尝试通过使用简单协议的网络与应用程序进行交互。我必须发送一个看起来像这样的标题:

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

4

5 回答 5

2

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

编辑:

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

于 2009-08-26T05:09:42.790 回答
1

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

于 2009-08-26T05:22:50.440 回答
1

尝试网络流:

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);
于 2009-08-26T05:24:05.600 回答
1

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

  • 字节序问题:您发送的 2 个字节长度的字节顺序是什么,您确定 GetBytes 以正确的顺序给出字节吗?
  • 数据包大小:您正在发送 256 个字节的数据,即使您的消息只有 3 个字节大小。
  • 有效负载:您不会在消息中放入任何有效负载,但消息 110 可能需要额外的数据。
于 2009-08-26T05:35:32.237 回答
0

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

于 2009-08-26T05:10:49.947 回答