Chinaunix

标题: 明眼人帮我看一眼!这段代码有问题? [打印本页]

作者: joeywakeup    时间: 2005-07-14 16:55
标题: 明眼人帮我看一眼!这段代码有问题?
void mgw_rcv_Listener(void *par)
{
                char p_buf[MSGHEADSIZE+DLVR_MSGBODY_SIZE_V30];
        char* p_temp=NULL;
        int offset=0;
        int numbytes=0, recvbytes=0;
        time_t cur_time;
        int sockfd;


        fd_set readfds;
        int nfds;
                while(1) {
                       numbytes=recv(sockfd, p_buf+recvbytes, MSGHEADSIZE+DLVR_MSGBODY_SIZE_V30-recvbytes,0);
                       if ( recvbytes>;= 12 )
                      {
                                                                                                            last_time=time(NULL);
                                                            trytimes=TRY_TIME;
                                                            p_temp=p_buf;
          while(recvbytes>;0)                                  {
                                       
                                                        Start_Parser(p_temp);
                                                        offset=ntohl(*(unsigned long*)(p_temp));
                                                       
                                                        recvbytes-=offset;
                                                         
                                                        p_temp+=offset;//取掉这句也不会core dump!但是结果不对!
                                                        SLEEP_(10);
                                                       
                }
       
问题出在这段!如果不用循环直接用Start_Parser(p_temp);这句代替红色语句就不会有问题!但是结果也不对,丢失一部分数据!               
                 }
                SLEEP_(30);
                }
}       

这段代码有问题?在solaris下^bus error coredump
作者: mq110    时间: 2005-07-14 16:59
标题: 明眼人帮我看一眼!这段代码有问题?
对sockfd什么都没做 就recv了??
作者: joeywakeup    时间: 2005-07-14 17:11
标题: 明眼人帮我看一眼!这段代码有问题?
:)sock_fd的工作都做了,在其他方法里,没法都写上来!
看着有点一头雾水对吧?
这里略去很多代码!应该不会影响的。
thr_create(0,0,mgw_rcv_Listener,NULL,0,&g_ThreadId[1]);
这是相关语句,该方法是在线程里的!
我说的是不是不清楚?
作者: ~~天涯    时间: 2005-07-14 19:18
标题: 明眼人帮我看一眼!这段代码有问题?
offset=ntohl(*(unsigned long*)(p_temp));
取出来的长度么???
作者: renstone921    时间: 2005-07-14 19:35
标题: 明眼人帮我看一眼!这段代码有问题?
老兄,看不懂你的程序,recvbytes是在那里修改的,我怎么找不到呢,如果recvbytes一直是0的话,if块怎么执行.还有能不能把要解析的数据的格式说一下.
在recv函数调用之后添加错误处理,先看一下错误信息.
我想首先你要确定到底是哪一部分程序出错.
判断是在数据接收部分出错还是在你的解析部分出错,
作者: zhf3690    时间: 2005-07-15 00:00
标题: 明眼人帮我看一眼!这段代码有问题?
p_temp=p_buf;
while(recvbytes>;0)   {

Start_Parser(p_temp);
offset=ntohl(*(unsigned long*)(p_temp));


unsigned long * aa;
memcpy( aa,p_temp,; // 假设为8
offset = ntohl(aa);
试试这样看看,因为系统在分配内存的时候按字分配的。就是说如果你想分配一个字节,会分配4个字节。这里网络字节序转换只是对long或int型,假设为8位长度。
作者: joeywakeup    时间: 2005-07-15 09:43
标题: 明眼人帮我看一眼!这段代码有问题?
每包前四个字节就是长度。打印出来 也是对的!




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2