控件不会在选择函数旁边移动

Control doesn't move next to the select function

本文关键字:移动 函数 选择 控件      更新时间:2023-10-16

我正在尝试实现一个接受多个客户端节点的TCP服务器。但是,控件只是停留在select(),并没有超出该范围。这是我的代码:

#include <iostream>
#include <string>
#include <sys/types.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
int main(){
int server_socket = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in hint;
hint.sin_family = AF_INET;
hint.sin_port = htons(2987);
inet_pton(AF_INET, "0.0.0.0", &hint.sin_addr);
bind(server_socket, (sockaddr*)&hint, sizeof(hint));
listen(server_socket, SOMAXCONN);
fd_set master;
FD_ZERO(&master);
FD_SET(server_socket, &master);
int client_socket;
sockaddr_in client_addr;
socklen_t client_len = sizeof(client_addr);
while(true){
fd_set copy = master;
int socket_count = select(0, &copy, nullptr, nullptr, nullptr);
cout << "Reached here!" << endl;
for(int i=0; i<socket_count; i++){
if(FD_ISSET(i, &copy)){
if(i == server_socket){
client_socket = accept(server_socket, (sockaddr *) &client_addr, &client_len);
}else{
// Message
}
}
}
}
}

但是,控件永远不会超出select语句。即使我使用 telnet 打开与服务器的连接,它也会保留在那里:

$ telnet 127.0.0.1 2987

为什么它卡在那里以及如何获得客户端套接字?

这是选择手册。

第一个参数不应为零,而是选择应管理加 1 的最高文件描述符。在您的情况下,它是:

int socket_count = select(server_socket + 1, &copy, nullptr, nullptr, nullptr);