簡體   English   中英

FD_SET 問題/網絡

[英]FD_SET Problem/Networking

嗨,現在我想知道客戶端或服務器是否斷開連接,然后發送錯誤,但我似乎無法讓它工作,我不知道該怎么做,所以我真的需要幫助

這是我的代碼

    #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);

該錯誤在“do”之前表示預期的主要表達式,所以是的,我不知道這意味着什么,以防萬一我是這樣聲明 fd_read 和 fd_close

fd_set fd_read;       
fd_set fd_close;   

請提供任何幫助將不勝感激 tyvm

此外,Richard 所說的,第三個傳遞給select()fd_set不是關於關閉的 FD,而是關於一些需要特別注意的異常情況(確切地說,是由底層驅動程序定義的,例如 TCP sockets 將其用於“緊急”數據。

您通過recv()的返回代碼檢測到遠程關閉,即在可讀描述符的處理中。 如果 stream 套接字上的recv()返回 0,則遠程端已關閉連接(使用 TCP,您仍然可以發送數據,因為只有一個方向關閉); 如果recv()返回 -1,則errno有更多信息,例如 ECONNRESET 表示收到了 TCP RST 數據包。

你想使用 if(FD_ISSET(...

要確定客戶端是否已關閉,您需要從活動的 readfd 中讀取並查看讀取是否返回零。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM