我正在努力创建一个简单的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协议的主要文档。
希望我已经足够清楚了。
答案 0 :(得分:1)
构造缓冲区时,将其传递给数组。但该数组包含尾随空终止符。将第二个参数传递给缓冲区,指示长度,不带最后一个字节sizeof(sendBuf)-1
答案 1 :(得分:0)
你应该检查来自boost :: asio :: write的返回码,以确保它发送的字节数与你想象的一样多。