peakzhang 发表于 2008-5-11 17:21:22

服务端发往客户端的报文,客户端为何收不到?

以下内容为程序代码:


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

peakzhang 发表于 2008-5-11 17:21:32

出现这个错误的原因可能性有很多的。调试也比较容易。
1、确定是否客户端和服务器无法进行连接,是否有连接存在。
2、是任何数据都收不到,还是你自己定义的数据收不到。
3、使用ethereal进行追踪很方便。
4、MsgHead *hd = (MsgHead*)in_mb->rd_ptr();

if(hd->type == MSG_REQUEST) - 你能保证数据是正确的吗?

peakzhang 发表于 2008-5-11 17:21:43

验证数据正确性,涉及安全和加密等问题。一般来说,只要符合我们自己设计的规则,就是正确的。
比如头部有标记什么的。
你得先检验是否可以正常连接,发送数据,然后才谈得上正确与否。
页: [1]
查看完整版本: 服务端发往客户端的报文,客户端为何收不到?