C++ 使用Telnet测试select()
我对Linux/socket编程相当陌生。我正在使用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是否仅用于查找新连接?我想我也可以用它来检查输入。下面是我的代码副
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_套件中?是和是。我已经在问题中添加了检查连接的代码。这可能是我刚刚错过的一些简单的事情。我真的很感谢你的帮助。