服务端发往客户端的报文,客户端为何收不到?
以下内容为程序代码:ACE_Message_Block *send_mb = 0;
//处理数据,并回应数据
if (ProcessPacket(&msg_blck, send_mb))
{
ws.write (*send_mb, send_mb->length());
}
////////////////
BOOL Asynch_Receiver::ProcessPacket(ACE_Message_Block *in_mb, ACE_Message_Block *&out_mb)
{
//假定包正确
MsgHead *hd = (MsgHead*)in_mb->rd_ptr();
if(hd->type == MSG_REQUEST)
{
switch(hd->req_type)
{
case REQ_LOGIN:
{
ReqLogin *msg = (ReqLogin*)in_mb->rd_ptr();
ACE_DEBUG ((LM_DEBUG, "user %s logined\n", msg->name));
AfxMessageBox(msg->name);
ReplyLogin repy;
repy.hd.identifier = hd->identifier + 1;
repy.hd.length = sizeof(ReplyLogin) - sizeof(MsgHead);
repy.hd.req_type = REPLY_LOGIN;
repy.hd.retry_times = 999;
repy.hd.type = MSG_REPLY;
repy.success = TRUE;
out_mb = this->aio_->malloc(DEFAULT_MAX_BLOCK_SIZE);
ACE_ASSERT(out_mb);
out_mb->socket_handle(this->handle());
out_mb->remote_ip(this->remote_addr_.get_ip_address());
out_mb->wr_ptr((char*)&repy);
out_mb->wr_ptr(sizeof(ReplyLogin));
out_mb->length(sizeof(ReplyLogin));
break;
}
}
return TRUE;
}
return FALSE;
}
出现这个错误的原因可能性有很多的。调试也比较容易。
1、确定是否客户端和服务器无法进行连接,是否有连接存在。
2、是任何数据都收不到,还是你自己定义的数据收不到。
3、使用ethereal进行追踪很方便。
4、MsgHead *hd = (MsgHead*)in_mb->rd_ptr();
if(hd->type == MSG_REQUEST) - 你能保证数据是正确的吗? 验证数据正确性,涉及安全和加密等问题。一般来说,只要符合我们自己设计的规则,就是正确的。
比如头部有标记什么的。
你得先检验是否可以正常连接,发送数据,然后才谈得上正确与否。
页:
[1]