首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 关于socket接收的问题(100分) [已结贴,结贴人:luozhongyu123]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • luozhongyu123
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 揭帖率:
    发表于:2008-08-20 09:31:51 楼主
    下面是我的代码
    int old_task_tcp_rev(void)
    {
    int i,ch,ret,sock_fd,new_fd;
    struct sockaddr_in my_addr;
    int numbytes,linkid,msulen;
    unsigned char state;
    int iOptVal;
    int iOptLen = sizeof(int);
    fd_set fds_read;
    int MaxFdSock;
    struct timeval tv;
    short bgen;
    char buffer[1024];
    unsigned char *buf=NULL, *abuf=NULL;
    long m;
    #define MAXBUFLEN  1024
    #define BACKLOG 10
    #define FDSOCK_UNDEF -1
       
    if((sock_fd=socket(AF_INET,SOCK_STREAM,0))==-1)
    {
    perror("socket:");
    goto lab_ret;
        }
       
    i = 1;
        setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));


        my_addr.sin_family=AF_INET;
    my_addr.sin_port=htons(global.cfg.c_smg.SpPort);
        my_addr.sin_addr.s_addr=INADDR_ANY;
        bzero(&(my_addr.sin_zero),8);
        if(bind(sock_fd,(struct sockaddr *)&my_addr,
    sizeof(struct sockaddr))==-1)
    {
    perror("bind:");
    goto lab_ret;
        }

    labstart:
    printf("listen here......\n");
        if(listen(sock_fd,BACKLOG)==-1)
    {
    perror("listen:");
    goto lab_ret;
        }

        if((new_fd=accept(sock_fd,NULL,NULL)) <0)
    {
    perror("accept:");
    goto lab_ret;
        }
        printf("客户端登录上 ");
    global.skFtServer.fd = new_fd;

    buf = malloc(MAXBUFLEN);
    if(buf==NULL) return(-1);
    abuf = buf;

        while(1)
        {


            FD_ZERO(&fds_read);
            MaxFdSock=0;
    if(new_fd!=FDSOCK_UNDEF)
    {
    FD_SET(new_fd,&fds_read);
    if(MaxFdSock <new_fd) MaxFdSock=new_fd;
    }
           
    tv.tv_sec =0;
            tv.tv_usec=100;
            ret=select(MaxFdSock+1, &fds_read, NULL,NULL,&tv);
            if(ret>0)
            {
    if(FD_ISSET(new_fd, &fds_read))
    {
    //从TCP端口接收数据流
    if((numbytes = recv(new_fd, abuf, 1024, 0)) <= 0)
    {
    perror("中断:");
    global.skFtServer.fd = 0;
    goto labstart;
    }           
    if( ntohl(* ((u32*)abuf)) == numbytes)
    {

    // DispHex(abuf,numbytes,0, "cmd");

    ProcessSmgSentMsg(abuf,numbytes);
                   
    }
    }
    }

    }

    lab_ret:
    close(new_fd);
      // close(sock_fd);
    free(buf);
    goto labstart;

        return 0;
    }

    这个程序可以接收到数据,但是时间长了后就接收不到了,希望达人帮我看看啊,在线等。希望大家能加我QQ 164985001 指导下 谢谢
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ouyh12345
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 2

    发表于:2008-08-20 09:42:281楼 得分:0
    没看代码。
    阻塞了不能接收?还是有错误?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • luozhongyu123
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-20 09:44:092楼 得分:0
    估计是阻塞了 我还没找出问题在哪 请楼上的帮忙看下好吗
    这个程序开始能收到 但是过了运行了一天后就收到不了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hqin6
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-20 09:53:203楼 得分:0
    天啦,lz的代码这么乱啊?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hqin6
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-20 09:54:244楼 得分:0
    引用 2 楼 luozhongyu123 的回复:
    估计是阻塞了 我还没找出问题在哪 请楼上的帮忙看下好吗
    这个程序开始能收到 但是过了运行了一天后就收到不了


    什么意思?

    重启一下也不能接收?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • luozhongyu123
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-20 09:55:485楼 得分:0
    重启就好了呀 但是我不能老是看着它有没有死掉 然后重启啊
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • luozhongyu123
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-20 09:57:026楼 得分:0
    代码写的有问题吧 大家帮忙改改啊 拜谢
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • luozhongyu123
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-20 10:10:127楼 得分:0
    大家帮忙啊
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lin_style
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-20 10:25:008楼 得分:0
    错误判断不完全
    recv接收有问题。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lin_style
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-20 10:25:329楼 得分:0
    recv(new_fd, abuf, 1024, 0)
    哪能这样写。。
    一没数据你就挂了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • luozhongyu123
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-20 10:26:2510楼 得分:0
    lin_style 能说详细点吗?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hqin6
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-20 10:30:2611楼 得分:0
    http://topic.csdn.net/t/20031112/00/2451493.html

    http://baike.baidu.com/view/569210.htm
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lala_benben
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-20 10:35:2512楼 得分:0
    你不是没释放socket描述符啊。。导致一段时间后到达了进程的资源上限。。。所以就不在能接收了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • luozhongyu123
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-20 10:41:0913楼 得分:0
    引用 12 楼 lala_benben 的回复:
    你不是没释放socket描述符啊。。导致一段时间后到达了进程的资源上限。。。所以就不在能接收了

    怎么样释放啊?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hqin6
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-20 10:53:1514楼 得分:0
    引用 13 楼 luozhongyu123 的回复:
    引用 12 楼 lala_benben 的回复:
    你不是没释放socket描述符啊。。导致一段时间后到达了进程的资源上限。。。所以就不在能接收了

    怎么样释放啊?


    close就行!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lin_style
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-20 11:17:4015楼 得分:0
    引用 10 楼 luozhongyu123 的回复:
    lin_style 能说详细点吗?


    好好看
    <unix network programming>

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lin_style
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-20 11:18:2916楼 得分:0
    如果你现在急用的话

    把里面的源代码中的 select接收和发送部分拿出来先用下,也能撑很久了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • luozhongyu123
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 10:49:2217楼 得分:0
    还是没办法解决 大家帮帮忙啊!!!!!!!!!!!!!!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dede22
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 10:56:0518楼 得分:0
    首先,你的sock_fd 应该关闭,把注释去掉。
    但这应该不是主要问题,如果你的文件句柄打开太多,重新启动程序也是不能用。
    你在recv数据的时候指定了一个固定长度,这才是主要问题,如果你接受的数据没有1024这么长,
    那就会一直阻塞,如果你的客户端有一次这种情况,就会出现死锁。你可以当程序锁定的时候,用调试
    工具看一下,看看程序在那个地方锁定了。
    如果你使用这种阻塞方式的话,建议使用协议通信,一次接收一个字节,先包头,后包体。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lala_benben
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 13:35:1719楼 得分:100
    引用 18 楼 dede22 的回复:
    首先,你的sock_fd 应该关闭,把注释去掉。
    但这应该不是主要问题,如果你的文件句柄打开太多,重新启动程序也是不能用。
    你在recv数据的时候指定了一个固定长度,这才是主要问题,如果你接受的数据没有1024这么长,
    那就会一直阻塞,如果你的客户端有一次这种情况,就会出现死锁。你可以当程序锁定的时候,用调试
    工具看一下,看看程序在那个地方锁定了。
    如果你使用这种阻塞方式的话,建议使用协议通信,一次接收一个字节…


    LS的。。不要误导别人好不

    你在recv数据的时候指定了一个固定长度,这才是主要问题,如果你接受的数据没有1024这么长,
    那就会一直阻塞。。。请理解清楚阻塞
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • luozhongyu123
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 13:44:0120楼 得分:0
    非常感谢lala_benben 在底下的指导!!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dede22
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 14:03:3521楼 得分:0
    这个是我说错了。。。呵呵,不好意思。阻塞的接受也会返回,但是不一定是你指定的长度,你要循环接收,知道接收到你想要的长度。
    你所说的没反应,太广泛,也可能不是接收的问题,出在别的地方,还是调试一下最方便。
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved