C++ 使用Telnet测试select()

C++ 使用Telnet测试select(),c++,c,sockets,telnet,select-function,C++,C,Sockets,Telnet,Select Function,我对Linux/socket编程相当陌生。我正在使用select检查服务器程序中的连接(它最终将成为聊天室服务器)。我正在使用telnet来测试它,奇怪的事情正在发生。当我第一次运行telnet(telnet localhost 5794)时,select返回1,并将新连接添加到我的主文件描述符列表中。一切看起来都很好 但后来我尝试在telnet中键入内容,但什么也没发生。除非打开新的telnet会话,否则选择返回0 select是否仅用于查找新连接?我想我也可以用它来检查输入。下面是我的代码副

我对Linux/socket编程相当陌生。我正在使用
select
检查服务器程序中的连接(它最终将成为聊天室服务器)。我正在使用telnet来测试它,奇怪的事情正在发生。当我第一次运行telnet(telnet localhost 5794)时,
select
返回1,并将新连接添加到我的主文件描述符列表中。一切看起来都很好

但后来我尝试在telnet中键入内容,但什么也没发生。除非打开新的telnet会话,否则选择返回0

select
是否仅用于查找新连接?我想我也可以用它来检查输入。下面是我的代码副本(现在有点乱,因为我在过去几个小时里一直在胡乱处理它。我很抱歉)

编辑:以下是newConnection的代码:

bool newConnection(int serverSocket, fd_set& ConnectionList, int maxFD, user* userGroup){
    printf("in newConnection\n");
    struct sockaddr_storage remoteaddr;

    socklen_t addrlen = sizeof remoteaddr;

    int newFD = accept(serverSocket,(struct sockaddr *)&remoteaddr,&addrlen);
    FD_SET(newFD, &ConnectionList);

    if (newFD > maxFD)
        maxFD = newFD;

    printf("We have a new connection!!! (newConnetcion)\n");

    bool userAdded = false;
    for (int i = 0; i < 50; i++){
      if (userGroup[i].active == false){
            userGroup[i].socket = newFD;
            userGroup[i].active = true;
            userAdded = true;
                        printf("User added in the %ith position of the array.(socket number %i)\n",i,newFD);
            break;
      }
    }
    if (!userAdded)
        printf("new user was not added! (newConnetcion)\n");
}
bool-newConnection(int-serverSocket、fd\u-set和ConnectionList、int-maxFD、user*userGroup){
printf(“在新连接中\n”);
结构sockaddr\u存储远程地址;
socklen_t addrlen=远程地址的大小;
int newFD=accept(serverSocket,(struct sockaddr*)&remoteaddr,&addrlen);
FD_集(新建FD和连接列表);
如果(newFD>maxFD)
maxFD=newFD;
printf(“我们有一个新连接!!!(newConnetcion)\n”);
bool userAdded=false;
对于(int i=0;i<50;i++){
if(userGroup[i].active==false){
用户组[i].socket=newFD;
用户组[i].active=true;
userAdded=true;
printf(“用户添加到数组的第%i个位置。(套接字编号%i)\n”,i,newFD);
打破
}
}
如果(!userAdded)
printf(“未添加新用户!(newConnetcion)\n”);
}
checkConnections函数的开头有一个printf,因此我可以在它进入函数时看到它。它从不打印。

问题就出在这里

int main(int argc, char *argv[])
{
    int maxFD = ...;
    ...
    newConnection(..., maxFD, ...);
    ...
}

void newConnection(..., int maxFD, ...)
{
    ...
    if (newFD > maxFD)
        maxFD = newFD;
    ...
}
请注意,有两个变量名为
maxFD
:一个在
main
函数中,另一个在
newConnection
函数中。改变一个不会改变另一个。建议:改用全局变量。(原因:整个应用程序只有一个,许多功能需要访问它。)

这是一个非常非常基本的错误。如果你不拍拍额头说“哦,这很明显”,那么你可能希望回头看一本编程入门书。

问题出在这里

int main(int argc, char *argv[])
{
    int maxFD = ...;
    ...
    newConnection(..., maxFD, ...);
    ...
}

void newConnection(..., int maxFD, ...)
{
    ...
    if (newFD > maxFD)
        maxFD = newFD;
    ...
}
请注意,有两个变量名为
maxFD
:一个在
main
函数中,另一个在
newConnection
函数中。改变一个不会改变另一个。建议:改用全局变量。(原因:整个应用程序只有一个,许多功能需要访问它。)


这是一个非常非常基本的错误。如果你不拍着额头说“哦,这很明显”,那么你可能想回去看看编程书的介绍。

选择
返回后,你会调用
接受
,对吗?然后您对由
accept
返回的套接字调用
read
?newConnect函数调用accept并将返回的文件描述符添加到主列表中,但我没有对其调用read。。。我现在就试试这个。好的。事实上,我不知道read应该做什么。checkConnections函数调用recv以获取输入。我应该用read吗?或者我稍后再给recv打电话。
read
recv
对于套接字来说基本上是一样的。
maxFD
是否曾递增?您是否将新插座添加到fd_套件中?是和是。我已经在问题中添加了检查连接的代码。这可能是我刚刚错过的一些简单的事情。非常感谢您的帮助。
select
返回后,您可以调用
accept
,对吗?然后您对由
accept
返回的套接字调用
read
?newConnect函数调用accept并将返回的文件描述符添加到主列表中,但我没有对其调用read。。。我现在就试试这个。好的。事实上,我不知道read应该做什么。checkConnections函数调用recv以获取输入。我应该用read吗?或者我稍后再给recv打电话。
read
recv
对于套接字来说基本上是一样的。
maxFD
是否曾递增?您是否将新插座添加到fd_套件中?是和是。我已经在问题中添加了检查连接的代码。这可能是我刚刚错过的一些简单的事情。我真的很感谢你的帮助。