我正在尝试制作一个简单的 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 协议的主要文档。
希望我已经足够清楚了。