亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 3106 | 回復(fù): 15
打印 上一主題 下一主題

網(wǎng)絡(luò)編程中的一個比較奇怪的問題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2009-01-06 09:32 |只看該作者 |倒序?yàn)g覽
在編程中遇到一個比較奇怪的問題,請大家給解釋一下是啥原因。

這個函數(shù)所做的功能就是“廣播功能”,把packet廣播出去。

在調(diào)試中,我發(fā)現(xiàn)了如下問題,這個問題有時會出現(xiàn),有時不錯出現(xiàn),不知道啥原因...

貌似當(dāng)網(wǎng)絡(luò)流量比較大時,會出現(xiàn)代碼中所指出的問題。當(dāng)網(wǎng)絡(luò)流量正常時,不會出現(xiàn)問題,不知道是啥原因?

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;
    }
  
    // 當(dāng)網(wǎng)絡(luò)流量比較繁忙時,bind 這一步往往會出現(xiàn)問題!
    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 [報告]
發(fā)表于 2009-01-06 09:42 |只看該作者

回復(fù) #1 anank 的帖子

個人猜測的原因:
------------------
      是不是這個函數(shù)中所做的事情太多了(建立socket, bind, send...等),以至于當(dāng)網(wǎng)絡(luò)很忙時,很頻繁的調(diào)用此函數(shù)就會出現(xiàn)問題?
      如果這樣的話,看來應(yīng)該來個socket的初始化,在每次broadcast時,只需sendto就可以了,這樣就可以減少建立socket,bind等步驟了。

一會用perror這個函數(shù)來打印試試

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

論壇徽章:
0
3 [報告]
發(fā)表于 2009-01-06 10:05 |只看該作者
因?yàn)槟愕腷ind已經(jīng)被調(diào)用過了,在它c(diǎn)lose后(約2- 4分鐘)或者還沒close的話再次調(diào)用就會失敗
建議:這些初始化操作調(diào)用一次不就夠了么?你干嘛來來回回的折騰?如果是特殊需要,那就設(shè)置度端口重用。。。

論壇徽章:
0
4 [報告]
發(fā)表于 2009-01-06 10:13 |只看該作者

回復(fù) #3 alexhappy 的帖子

樓上說的有理,估計(jì)是這個原因,那我現(xiàn)在就改正過來!
-------------
原來這樣寫的原因,覺得這樣看起來更加“模塊化”(也不需要初始化什么的,只要調(diào)用這個函數(shù)傳個參數(shù)就OK了),看來是有問題...

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

論壇徽章:
0
5 [報告]
發(fā)表于 2009-01-06 10:28 |只看該作者
原帖由 alexhappy 于 2009-1-6 10:05 發(fā)表
因?yàn)槟愕腷ind已經(jīng)被調(diào)用過了,在它c(diǎn)lose后(約2- 4分鐘)或者還沒close的話再次調(diào)用就會失敗
建議:這些初始化操作調(diào)用一次不就夠了么?你干嘛來來回回的折騰?如果是特殊需要,那就設(shè)置度端口重用。。。



接著問個問題:
----------------------------
如果按照這種思路做的話,那么close(socket)肯定要在程序退出時執(zhí)行(釋放資源)

但是如果程序是異常退出,那么這個socket就不能關(guān)閉了

請問:
      【1】:應(yīng)用程序終止后,系統(tǒng)會自動幫我們回收資源?
      【2】:如果系統(tǒng)不幫我們回收,這種資源的浪費(fèi)厲害嗎?

論壇徽章:
0
6 [報告]
發(fā)表于 2009-01-06 10:41 |只看該作者
進(jìn)程終止后,操作系統(tǒng)會幫我們回收資源的

論壇徽章:
0
7 [報告]
發(fā)表于 2009-01-06 11:13 |只看該作者
TIME_WAIT

論壇徽章:
0
8 [報告]
發(fā)表于 2009-01-07 14:08 |只看該作者
原帖由 chary8088 于 2009-1-6 11:13 發(fā)表
TIME_WAIT



各位能具體指出TIME_WAIT出現(xiàn)的地方嗎?

論壇徽章:
0
9 [報告]
發(fā)表于 2009-01-07 14:10 |只看該作者
原帖由 anank 于 2009-1-7 14:08 發(fā)表



各位能具體指出TIME_WAIT出現(xiàn)的地方嗎?

你主動close了。而對方?jīng)]有close

論壇徽章:
0
10 [報告]
發(fā)表于 2009-01-07 14:16 |只看該作者
原帖由 5毛黨黨員 于 2009-1-7 14:10 發(fā)表

你主動close了。而對方?jīng)]有close



對了,我忘了很重要的一點(diǎn):::

我這個是UDP,close的也是UDP的連接。

忽然想起TIME_WAIT是對TCP連接的啊.
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP