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

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

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
12下一頁(yè)
最近訪(fǎng)問(wèn)板塊 發(fā)新帖
查看: 5964 | 回復(fù): 10
打印 上一主題 下一主題

[函數(shù)] select返回-1的問(wèn)題 [復(fù)制鏈接]

論壇徽章:
1
15-16賽季CBA聯(lián)賽之深圳
日期:2016-02-17 16:12:23
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2016-02-22 15:42 |只看該作者 |倒序?yàn)g覽

描述符集合中監(jiān)聽(tīng)多個(gè)socket,長(zhǎng)連接。

當(dāng)一個(gè)客戶(hù)端的連接斷掉后,

select會(huì)返回-1,errno=9  Bad file descriptor。

請(qǐng)問(wèn)這種情況怎么處理?

如何判斷是哪個(gè)socket斷開(kāi)了連接,從而在select監(jiān)視的描述符集合中,將該斷開(kāi)的socket移除?


論壇徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16賽季CBA聯(lián)賽之江蘇
日期:2017-11-27 11:42:3515-16賽季CBA聯(lián)賽之八一
日期:2017-04-12 14:26:2815-16賽季CBA聯(lián)賽之吉林
日期:2016-08-20 10:43:1215-16賽季CBA聯(lián)賽之廣夏
日期:2016-06-23 09:53:58程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-02-11 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-02-09 06:20:0015-16賽季CBA聯(lián)賽之上海
日期:2015-12-25 16:40:3515-16賽季CBA聯(lián)賽之廣夏
日期:2015-12-22 09:39:36程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-08-24 06:20:002015亞冠之德黑蘭石油
日期:2015-08-07 09:57:302015年辭舊歲徽章
日期:2015-03-03 16:54:15
2 [報(bào)告]
發(fā)表于 2016-02-23 09:54 |只看該作者
回復(fù) 1# lewy7


    客戶(hù)端斷掉應(yīng)該是read = 0吧,在讀事件里面close和fd_clr就可以了

recv.JPG (33.05 KB, 下載次數(shù): 100)

recv.JPG

論壇徽章:
1
15-16賽季CBA聯(lián)賽之深圳
日期:2016-02-17 16:12:23
3 [報(bào)告]
發(fā)表于 2016-02-23 11:11 |只看該作者
回復(fù) 2# lxyscls


    試了一下,當(dāng)select返回-1時(shí),F(xiàn)D_ISSET并不能得到斷開(kāi)連接的socket,這樣我就不知道要去recv哪個(gè)socket了。

論壇徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16賽季CBA聯(lián)賽之江蘇
日期:2017-11-27 11:42:3515-16賽季CBA聯(lián)賽之八一
日期:2017-04-12 14:26:2815-16賽季CBA聯(lián)賽之吉林
日期:2016-08-20 10:43:1215-16賽季CBA聯(lián)賽之廣夏
日期:2016-06-23 09:53:58程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-02-11 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-02-09 06:20:0015-16賽季CBA聯(lián)賽之上海
日期:2015-12-25 16:40:3515-16賽季CBA聯(lián)賽之廣夏
日期:2015-12-22 09:39:36程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-08-24 06:20:002015亞冠之德黑蘭石油
日期:2015-08-07 09:57:302015年辭舊歲徽章
日期:2015-03-03 16:54:15
4 [報(bào)告]
發(fā)表于 2016-02-23 11:20 |只看該作者
回復(fù) 3# lewy7


    在你的讀事件里面處理recv = 0的情況,而不是select返回-1的時(shí)候

論壇徽章:
1
15-16賽季CBA聯(lián)賽之深圳
日期:2016-02-17 16:12:23
5 [報(bào)告]
發(fā)表于 2016-02-23 11:31 |只看該作者
回復(fù) 4# lxyscls


    socket集合里面都是長(zhǎng)連接,select阻塞監(jiān)聽(tīng)這些socket的事件,如果有可讀的事件到來(lái),才會(huì)去read有事件到來(lái)的socket;
    也就是說(shuō)select阻塞直到有事件到來(lái),否則不會(huì)主動(dòng)去read集合里的socket的。

    現(xiàn)在的問(wèn)題就是select返回-1后,找不到斷開(kāi)連接的socket。

論壇徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16賽季CBA聯(lián)賽之江蘇
日期:2017-11-27 11:42:3515-16賽季CBA聯(lián)賽之八一
日期:2017-04-12 14:26:2815-16賽季CBA聯(lián)賽之吉林
日期:2016-08-20 10:43:1215-16賽季CBA聯(lián)賽之廣夏
日期:2016-06-23 09:53:58程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-02-11 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-02-09 06:20:0015-16賽季CBA聯(lián)賽之上海
日期:2015-12-25 16:40:3515-16賽季CBA聯(lián)賽之廣夏
日期:2015-12-22 09:39:36程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-08-24 06:20:002015亞冠之德黑蘭石油
日期:2015-08-07 09:57:302015年辭舊歲徽章
日期:2015-03-03 16:54:15
6 [報(bào)告]
發(fā)表于 2016-02-23 11:47 |只看該作者
回復(fù) 5# lewy7


    客戶(hù)端關(guān)斷,沒(méi)有讀事件上來(lái)嗎?

論壇徽章:
1
15-16賽季CBA聯(lián)賽之深圳
日期:2016-02-17 16:12:23
7 [報(bào)告]
發(fā)表于 2016-02-23 11:56 |只看該作者
回復(fù) 6# lxyscls


    沒(méi)有可讀事件,select直接就返回-1,然后errno就是9了。

    ERRORS
       EBADF  An  invalid  file descriptor was given in one of the sets.  (Perhaps a file descriptor that was already closed, or one on which an error
              has occurred.)

論壇徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16賽季CBA聯(lián)賽之江蘇
日期:2017-11-27 11:42:3515-16賽季CBA聯(lián)賽之八一
日期:2017-04-12 14:26:2815-16賽季CBA聯(lián)賽之吉林
日期:2016-08-20 10:43:1215-16賽季CBA聯(lián)賽之廣夏
日期:2016-06-23 09:53:58程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-02-11 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-02-09 06:20:0015-16賽季CBA聯(lián)賽之上海
日期:2015-12-25 16:40:3515-16賽季CBA聯(lián)賽之廣夏
日期:2015-12-22 09:39:36程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-08-24 06:20:002015亞冠之德黑蘭石油
日期:2015-08-07 09:57:302015年辭舊歲徽章
日期:2015-03-03 16:54:15
8 [報(bào)告]
發(fā)表于 2016-02-23 12:24 |只看該作者
回復(fù) 7# lewy7


    貼代碼

論壇徽章:
1
15-16賽季CBA聯(lián)賽之深圳
日期:2016-02-17 16:12:23
9 [報(bào)告]
發(fā)表于 2016-02-23 12:42 |只看該作者
回復(fù) 8# lxyscls
  1.         int    clientArray[256];
  2.         int    clientConnected;
  3.         int    listenFd ,clientFd;
  4.         fd_set fds;
  5.         listenFd = socket_listen(socketFile);
  6.        
  7.         while(1){
  8.                 FD_ZERO(&fds);
  9.                 FD_SET(listenFd, &fds);
  10.                 maxfdsn = listenFd;
  11.                
  12.                 for( i=0;i<clientConnected;i++ ){
  13.                         FD_SET(clientArray[i], &fds);
  14.                         if( clientArray[i] > maxfdsn )
  15.                                 maxfdsn = clientArray[i];
  16.                 }
  17.                
  18.                 ret = select(maxfdsn+1, &fds, NULL, NULL, NULL);
  19.                 if(ret<0){
  20.                         //*********
  21.                         for (i = 0; i < clientConnected; i++) {
  22.             if (FD_ISSET(clientArray[i], &fds)) {
  23.                     //返回-1的時(shí)候可讀事件沒(méi)有觸發(fā)
  24.                                         memset(&data,0,sizeof( jss_monitor_t ));
  25.                                         recvLen = read(clientArray[i],&data,sizeof( jss_monitor_t));
  26.                                         sprintf(sysBuf,  "select return error fd %d len {%d} \n",clientArray[i],recvLen);
  27.                                         write(logFd,sysBuf,strlen(sysBuf));
  28.             }
  29.           }
  30.                         continue;
  31.                 }

  32.                
  33.                 if(FD_ISSET(listenFd,&fds)){
  34.                         memset(&un,0,sizeof(struct sockaddr_un));
  35.                         addrLen = sizeof(struct sockaddr_un);
  36.                         clientFd = accept(listenFd,(struct sockaddr *)&un,  (socklen_t *)&addrLen);
  37.                         if (clientFd <= 0) {
  38.                                 continue;
  39.                         }
  40.                        
  41.                         setsockopt(clientFd ,SOL_SOCKET,SO_RCVTIMEO,&timeout,sizeof(timeout));
  42.                         //add to overlook array
  43.                         clientArray[clientConnected] = clientFd;
  44.                         clientConnected++;
  45.                 }

  46.                 // check every client fd in the set
  47.         for (i = 0; i < clientConnected; i++) {
  48.             if (FD_ISSET(clientArray[i], &fds)) {
  49.                         memset(&data,0,sizeof( jss_monitor_t ));
  50.                         recvLen = read(clientArray[i],&data,sizeof( jss_monitor_t));
  51.                        
  52.                         if (recvLen <= 0) {
  53.                                         FD_CLR(clientArray[i], &fds);
  54.                                         close(clientArray[i]);
  55.                                         for( j=i;j<clientConnected;j++){
  56.                                                         clientArray[ j ]=clientArray[ j+1 ];
  57.                                         }
  58.                                         close(clientArray[i]);
  59.                                         clientConnected--;
  60.                                         break;
  61.                         }
  62.                   }//end while read

  63.         }
  64.                
  65.         }// end death loop
復(fù)制代碼

論壇徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16賽季CBA聯(lián)賽之江蘇
日期:2017-11-27 11:42:3515-16賽季CBA聯(lián)賽之八一
日期:2017-04-12 14:26:2815-16賽季CBA聯(lián)賽之吉林
日期:2016-08-20 10:43:1215-16賽季CBA聯(lián)賽之廣夏
日期:2016-06-23 09:53:58程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-02-11 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-02-09 06:20:0015-16賽季CBA聯(lián)賽之上海
日期:2015-12-25 16:40:3515-16賽季CBA聯(lián)賽之廣夏
日期:2015-12-22 09:39:36程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-08-24 06:20:002015亞冠之德黑蘭石油
日期:2015-08-07 09:57:302015年辭舊歲徽章
日期:2015-03-03 16:54:15
10 [報(bào)告]
發(fā)表于 2016-02-23 12:54 |只看該作者
本帖最后由 lxyscls 于 2016-02-23 12:56 編輯

回復(fù) 9# lewy7

  1.         for (i = 0; i < clientConnected; i++) {
  2.             if (FD_ISSET(clientArray[i], &fds)) {
  3.                         memset(&data,0,sizeof( jss_monitor_t ));
  4.                         recvLen = read(clientArray[i],&data,sizeof( jss_monitor_t));
  5.                         
  6.                         if (recvLen <= 0) {
  7.                                         FD_CLR(clientArray[i], &fds);
  8.                                         close(clientArray[i]);
  9.                                         for( j=i;j<clientConnected;j++){
  10.                                                         clientArray[ j ]=clientArray[ j+1 ];
  11.                                         }
  12.                                         close(clientArray[i]);
  13.                                         clientConnected--;
  14.                                         break;
  15.                         }
  16.                   }//end while read

  17.         }
  18.                
  19.         }// end death loop
復(fù)制代碼
你多close了一次,這次close了一個(gè)正確的fd,然后又去select,所以就bad file descriptor了

您需要登錄后才可以回帖 登錄 | 注冊(cè)

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP