0

我正在尝试制作一个简单的 msn 客户端,主要是为了好玩,但也出于教育目的。我开始尝试使用 Boost Asio 发送和接收一些 tcp 包,因为我想要跨平台支持。我设法发送了一个“VER”命令并收到它的响应。

但是,在我发送以下“CVR”命令后,Asio 会抛出“文件结束”错误。经过进一步研究后,我通过数据包嗅探发现,我发送到信使服务器的 tcp 数据包在消息末尾有一个额外的“null”字符(Ascii 代码:00)。这意味着我的 VER 命令最后会得到一个额外的字符,我认为信使服务器不喜欢它,因此当我尝试读取 CVR 响应时会关闭连接。

这是我的包在嗅探时的样子,(它是有效负载):

(十六进制:) 56 45 52 20 31 20 4d 53 4e 50 31 35 20 43 56 52 30 0a 0a 00
(字符:) VER 1 MSNP15 CVR 0...

这就是 Adium(OS X 的聊天客户端)包的外观:

(十六进制:) 56 45 52 20 31 20 4d 53 4e 50 31 35 20 43 56 52 30 0d 0a
(字符:) VER 1 MSNP15 CVR 0..

所以我的问题是是否有任何方法可以删除每个包末尾的空字符,或者我是否误解了某些东西并以错误的方式使用了 Asio。我的 write 函数(稍作编辑)看起来很简单:

int sendVERMessage() {
    boost::system::error_code ignored_error;
    char sendBuf[] = "VER 1 MSNP15 CVR0\r\n";
    boost::asio::write(socket, boost::asio::buffer(sendBuf),
                       boost::asio::transfer_all(), ignored_error);
    if(ignored_error) {
        cout << "Failed to send to host!" << endl;
        return 1;
    }

    cout << "VER message sent!" << endl;
    return 0;
}

这是我正在使用的 msn 协议的主要文档

希望我已经足够清楚了。

4

2 回答 2

1

当你构造一个缓冲区时,你传递给它一个数组。但该数组包含尾随空终止符。将第二个参数传递给缓冲区,指示没有最后一个字节的长度 sizeof(sendBuf)-1

于 2010-06-05T11:53:32.067 回答
0

您应该检查 boost::asio::write 的返回码,以确保它发送的字节数与您认为的一样多。

于 2010-06-05T01:45:05.210 回答