Boost :: Asio - 删除tcp包末尾的“null”字符

时间:2010-06-05 00:51:39

标签: boost tcp boost-asio msn

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

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

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

(Hex :) 56 45 52 20 31 20 4d 53 4e 50 31 35 20 43 56 52 30 0a 0a 00
(Char :) VER 1 MSNP15 CVR 0 ...

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

(Hex :) 56 45 52 20 31 20 4d 53 4e 50 31 35 20 43 56 52 30 0d 0a
(Char :) VER 1 MSNP15 CVR 0 ..

所以我的问题是,如果有任何方法可以删除每个包末尾的空字符,如果我误解了某些内容并以错误的方式使用了Asio。我的写函数(稍加编辑)看起来很简单:

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;
}

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

希望我已经足够清楚了。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

你应该检查来自boost :: asio :: write的返回码,以确保它发送的字节数与你想象的一样多。