控件不会在选择函数旁边移动
Control doesn't move next to the select function
我正在尝试实现一个接受多个客户端节点的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, ©, nullptr, nullptr, nullptr);
cout << "Reached here!" << endl;
for(int i=0; i<socket_count; i++){
if(FD_ISSET(i, ©)){
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, ©, nullptr, nullptr, nullptr);
相关文章:
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- std::vector::p ush_back() 不会在 MSVC 上编译具有已删除移动构造函数的对象
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- 为什么调用复制构造函数而不是移动构造函数?
- 移动赋值运算符;尝试引用已删除的函数.我该如何解决这个问题?
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 具有已删除移动和复制构造函数的类的就地构造
- 使用移动和复制语义时函数匹配如何工作?
- 移动构造函数和右值引用
- 使用移动调用对等构造函数unique_ptr默认构造函数
- 为什么 std::memmove 中联合的默认非平凡移动构造函数C++?
- 使用宏来覆盖移动函数的接口的缺点
- 在头文件中移动函数以获得干净的排序
- 为什么派生类中复制/移动函数"normal"实现的行为会有所不同,具体取决于它们的定义方式?
- 在没有移动函数的情况下返回不可复制对象的解决方法
- 从技术上讲,如何在不复制的情况下移动函数返回值
- 我是否需要添加空测试无处不在,一旦我有移动函数
- 如果函数调用是返回语句,编译器可以自动移动函数参数吗?
- 当派生函数定义了析构函数时,使用复制函数而不是移动函数