免费注册 查看新帖 |

Chinaunix

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

网络编程中的一个比较奇怪的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-06 09:32 |只看该作者 |倒序浏览
在编程中遇到一个比较奇怪的问题,请大家给解释一下是啥原因。

这个函数所做的功能就是“广播功能”,把packet广播出去。

在调试中,我发现了如下问题,这个问题有时会出现,有时不错出现,不知道啥原因...

貌似当网络流量比较大时,会出现代码中所指出的问题。当网络流量正常时,不会出现问题,不知道是啥原因?

A_STATUS scLBBroadcast( const LB_INFO *packet)   
{
        int fd = 0, optval = 1, i;
        struct sockaddr_in sin, to;
         
        unsigned char         buf[LB_MAX_SIZE];
       
        if ((fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
       {
            printf("scLBBroadcast : error : can not establish a socket for broadcast!\n\n") ;
            return A_ERROR;
       }
   
    bzero((char *)&sin, sizeof(struct sockaddr_in));
    sin.sin_family      = AF_INET;
    sin.sin_port        = htons(0x868D);
    sin.sin_addr.s_addr = htonl(INADDR_ANY);
   
    if(setsockopt(fd, SOL_SOCKET, SO_BROADCAST, (char *)&optval, sizeof (optval)) == -1)
    {
        printf("scLBBroadcast : error : can not set broadcast!\n\n") ;
        return A_ERROR;
    }
  
    // 当网络流量比较繁忙时,bind 这一步往往会出现问题!
    if (bind(fd, (struct sockaddr *)&sin, sizeof(struct sockaddr_in)) == -1)

    {
        close(fd);
        printf("scLBBroadcast : error : can not bind the socket for broadcast!\n\n") ;
        return A_ERROR;
    }
   
    bzero((char *)&to, sizeof(struct sockaddr_in));
    to.sin_family       = AF_INET;
    to.sin_port         = htons(0x868C);
    to.sin_addr.s_addr  = htonl(apCfgIpAddrGet() | 0x000000FF);   
                                                                  
    memcpy( (char*)buf, (char*)(packet), sizeof(LB_INFO) );
   
    for (i=0; i<LB_BROADCAST_TIMES; i++)
    {
            if (sendto(fd, buf, sizeof(LB_INFO), 0, (struct sockaddr *)&(to), sizeof(struct sockaddr_in)) < 0)
            {
            }
        }
       
        if ( close(fd) == -1)
        {
            printf("scLBBroadcast : error : error occurs when closing socket !\n\n") ;
            return A_ERROR;
        }   
    fd = 0;
    return A_OK;
}

[ 本帖最后由 anank 于 2009-1-6 09:39 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-01-06 09:42 |只看该作者

回复 #1 anank 的帖子

个人猜测的原因:
------------------
      是不是这个函数中所做的事情太多了(建立socket, bind, send...等),以至于当网络很忙时,很频繁的调用此函数就会出现问题?
      如果这样的话,看来应该来个socket的初始化,在每次broadcast时,只需sendto就可以了,这样就可以减少建立socket,bind等步骤了。

一会用perror这个函数来打印试试

[ 本帖最后由 anank 于 2009-1-6 09:44 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-01-06 10:05 |只看该作者
因为你的bind已经被调用过了,在它close后(约2- 4分钟)或者还没close的话再次调用就会失败
建议:这些初始化操作调用一次不就够了么?你干嘛来来回回的折腾?如果是特殊需要,那就设置度端口重用。。。

论坛徽章:
0
4 [报告]
发表于 2009-01-06 10:13 |只看该作者

回复 #3 alexhappy 的帖子

楼上说的有理,估计是这个原因,那我现在就改正过来!
-------------
原来这样写的原因,觉得这样看起来更加“模块化”(也不需要初始化什么的,只要调用这个函数传个参数就OK了),看来是有问题...

[ 本帖最后由 anank 于 2009-1-6 10:14 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2009-01-06 10:28 |只看该作者
原帖由 alexhappy 于 2009-1-6 10:05 发表
因为你的bind已经被调用过了,在它close后(约2- 4分钟)或者还没close的话再次调用就会失败
建议:这些初始化操作调用一次不就够了么?你干嘛来来回回的折腾?如果是特殊需要,那就设置度端口重用。。。



接着问个问题:
----------------------------
如果按照这种思路做的话,那么close(socket)肯定要在程序退出时执行(释放资源)

但是如果程序是异常退出,那么这个socket就不能关闭了

请问:
      【1】:应用程序终止后,系统会自动帮我们回收资源?
      【2】:如果系统不帮我们回收,这种资源的浪费厉害吗?

论坛徽章:
0
6 [报告]
发表于 2009-01-06 10:41 |只看该作者
进程终止后,操作系统会帮我们回收资源的

论坛徽章:
0
7 [报告]
发表于 2009-01-06 11:13 |只看该作者
TIME_WAIT

论坛徽章:
0
8 [报告]
发表于 2009-01-07 14:08 |只看该作者
原帖由 chary8088 于 2009-1-6 11:13 发表
TIME_WAIT



各位能具体指出TIME_WAIT出现的地方吗?

论坛徽章:
0
9 [报告]
发表于 2009-01-07 14:10 |只看该作者
原帖由 anank 于 2009-1-7 14:08 发表



各位能具体指出TIME_WAIT出现的地方吗?

你主动close了。而对方没有close

论坛徽章:
0
10 [报告]
发表于 2009-01-07 14:16 |只看该作者
原帖由 5毛党党员 于 2009-1-7 14:10 发表

你主动close了。而对方没有close



对了,我忘了很重要的一点:::

我这个是UDP,close的也是UDP的连接。

忽然想起TIME_WAIT是对TCP连接的啊.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP