FD_SET问题/网络

时间:2011-07-08 02:15:10

标签: c++ networking select

嗨现在我试图知道客户端或服务器是否断开然后发送错误但我似乎无法使其工作,我不知道如何做到这一点所以我真的需要帮助PLZ

这是我的代码

    #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'之前预期的primary-expression 所以是的,我不知道这意味着什么 以防这是我如何宣布fd_read和fd_close

fd_set fd_read;       
fd_set fd_close;   

PLZ任何帮助都会非常感谢tyvm

2 个答案:

答案 0 :(得分:2)

理查德所说的另外,传递给fd_set的第三个select()不是关于封闭的FD,而是关于需要特别注意的一些特殊情况(确切地说,由底层驱动因素定义)例如,TCP套接字将其用于“紧急”数据。

您通过recv()的返回代码检测到远程关闭,即在处理可读描述符的内部。如果流套接字上的recv()返回0,则远程端已关闭连接(使用TCP,您仍然可以发送数据,因为只有一个方向关闭);如果recv()返回-1,则errno有更多信息,例如ECONNRESET表示已收到TCP RST数据包。

答案 1 :(得分:0)

你想使用if(FD_ISSET(...

要确定客户端是否已关闭,您需要从活动的readfd读取并查看读取是否返回零。