免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1436 | 回复: 6
打印 上一主题 下一主题

明眼人帮我看一眼!这段代码有问题? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 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

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2005-07-14 16:59 |只看该作者

明眼人帮我看一眼!这段代码有问题?

对sockfd什么都没做 就recv了??

论坛徽章:
0
3 [报告]
发表于 2005-07-14 17:11 |只看该作者

明眼人帮我看一眼!这段代码有问题?

:)sock_fd的工作都做了,在其他方法里,没法都写上来!
看着有点一头雾水对吧?
这里略去很多代码!应该不会影响的。
thr_create(0,0,mgw_rcv_Listener,NULL,0,&g_ThreadId[1]);
这是相关语句,该方法是在线程里的!
我说的是不是不清楚?

论坛徽章:
0
4 [报告]
发表于 2005-07-14 19:18 |只看该作者

明眼人帮我看一眼!这段代码有问题?

offset=ntohl(*(unsigned long*)(p_temp));
取出来的长度么???

论坛徽章:
0
5 [报告]
发表于 2005-07-14 19:35 |只看该作者

明眼人帮我看一眼!这段代码有问题?

老兄,看不懂你的程序,recvbytes是在那里修改的,我怎么找不到呢,如果recvbytes一直是0的话,if块怎么执行.还有能不能把要解析的数据的格式说一下.
在recv函数调用之后添加错误处理,先看一下错误信息.
我想首先你要确定到底是哪一部分程序出错.
判断是在数据接收部分出错还是在你的解析部分出错,

论坛徽章:
0
6 [报告]
发表于 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位长度。

论坛徽章:
0
7 [报告]
发表于 2005-07-15 09:43 |只看该作者

明眼人帮我看一眼!这段代码有问题?

每包前四个字节就是长度。打印出来 也是对的!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP