2011-07-08 185 views
0

嗨,現在即時通訊試圖瞭解客戶端或服務器斷開連接,然後發送錯誤,但我似乎無法使它工作,我不知道如何做到這一點,所以我真的需要幫助plzFD_SET問題/網絡

這裏是我的代碼

#ifdef _WIN32 || _WIN64 
      if(select(0,&fd_read,NULL,&fd_close,&time)==-1){ 
       printf("Error in Select()"); 
       return 0; 
      } 
    #else 
      if(select(sockMax + 1,&fd_read,NULL,&fd_close,&time)==-1){ 
       printf("Error in Select()"); 
       return 0; 
      } 
    #endif 

if(FD_ISSET(socklisten,&fd_read)){ 

     } 
     else 
     { 
      dopack(&pkt); 
      send(socklisten, (char*)&pkt, sizeof(pack), 0); 
     } 


//this is where the error shows ----------- 
     if(FD_SET(socklisten,&fd_close)) 
     { 
      backtoMenu = true; 
     } 

     FD_ZERO(&fd_leer); 

     FD_SET(sockEscucha,&fd_leer); 

錯誤稱預期主表達式前「做」 所以是的,我有不知道這意味着什麼 以防萬一,這是IM聲明FD_READ以及如何FD_CLOSE

fd_set fd_read;  
fd_set fd_close; 

PLZ任何幫助將非常感激tyvm

+1

繼續刪除代碼,直到它工作,然後開始添加回來,直到它破壞。然後你會知道什麼是錯的。 –

+0

我知道什麼是錯的if(FD_SET(socklisten,&fd_close))其他代碼的作品完美 – Makenshi

回答

2

什麼理查德說,此外,傳遞給select()第三fd_set是不是封閉的文件描述符,而是大約需要特別注意(這恰好是由底層驅動程序定義的,例如在一些特殊情況下,TCP套接字使用它爲「緊急」的數據。

您檢測從recv()返回代碼,即以搬運可讀描述符中遠程關閉。如果recv()上一個流套接字返回0,遠程端已經關閉了連接(與TCP ,您仍然可以發送數據,因爲只有一個方向關閉);如果recv()返回-1,則errno有更多信息,例如ECONNRESET意味着收到一個TCP RST數據包。

+0

沒錯。西蒙是對的。 –

+0

很好的答案非常感謝你 – Makenshi

0

你想用IF(FD_ISSET(...

要確定客戶端已經關閉,你想從活動readfd閱讀,看讀取返回零。

+0

nope它不工作:S我的意思是它正在compilling,但它沒有做我想要的 – Makenshi