Chinaunix

标题: 网络编程中的一个比较奇怪的问题 [打印本页]

作者: anank    时间: 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 编辑 ]
作者: anank    时间: 2009-01-06 09:42
标题: 回复 #1 anank 的帖子
个人猜测的原因:
------------------
      是不是这个函数中所做的事情太多了(建立socket, bind, send...等),以至于当网络很忙时,很频繁的调用此函数就会出现问题?
      如果这样的话,看来应该来个socket的初始化,在每次broadcast时,只需sendto就可以了,这样就可以减少建立socket,bind等步骤了。

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

[ 本帖最后由 anank 于 2009-1-6 09:44 编辑 ]
作者: alexhappy    时间: 2009-01-06 10:05
因为你的bind已经被调用过了,在它close后(约2- 4分钟)或者还没close的话再次调用就会失败
建议:这些初始化操作调用一次不就够了么?你干嘛来来回回的折腾?如果是特殊需要,那就设置度端口重用。。。
作者: anank    时间: 2009-01-06 10:13
标题: 回复 #3 alexhappy 的帖子
楼上说的有理,估计是这个原因,那我现在就改正过来!
-------------
原来这样写的原因,觉得这样看起来更加“模块化”(也不需要初始化什么的,只要调用这个函数传个参数就OK了),看来是有问题...

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



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

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

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

作者: alexhappy    时间: 2009-01-06 10:41
进程终止后,操作系统会帮我们回收资源的
作者: chary8088    时间: 2009-01-06 11:13
TIME_WAIT
作者: anank    时间: 2009-01-07 14:08
原帖由 chary8088 于 2009-1-6 11:13 发表
TIME_WAIT



各位能具体指出TIME_WAIT出现的地方吗?
作者: 5毛党党员    时间: 2009-01-07 14:10
原帖由 anank 于 2009-1-7 14:08 发表



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

你主动close了。而对方没有close
作者: anank    时间: 2009-01-07 14:16
原帖由 5毛党党员 于 2009-1-7 14:10 发表

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



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

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

忽然想起TIME_WAIT是对TCP连接的啊.

作者: alexhappy    时间: 2009-01-07 14:17
原帖由 anank 于 2009-1-7 14:08 发表



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

UNIX网络编程具体有说
作者: Cyberman.Wu    时间: 2009-01-07 17:26
至少应该先查一下errno吧?
作者: aobai    时间: 2009-01-07 18:56
原帖由 anank 于 2009-1-7 14:16 发表



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

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

忽然想起TIME_WAIT是对TCP连接的啊.


关注~
作者: sanor    时间: 2009-01-08 09:16
UDP 何来TIME_WAIT一说...
作者: anank    时间: 2009-01-08 09:49
原帖由 sanor 于 2009-1-8 09:16 发表
UDP 何来TIME_WAIT一说...



那是啥问题呢?...
作者: 到处走走    时间: 2009-01-08 12:34
errno
打印出来看看吧~~~~~~~~~~~~~~~~~~
赶紧




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