控件不会移动到选择功能旁边
Posted
技术标签:
【中文标题】控件不会移动到选择功能旁边【英文标题】:Control doesn't move next to the select function 【发布时间】:2020-05-14 07:08:47 【问题描述】:我正在尝试实现一个接受多个客户端节点的 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
为什么它卡在那里,我如何获得客户端套接字?
【问题讨论】:
你的select()
函数来自哪里?您可以尝试使用调试器来查看程序卡在函数中的哪个位置
我已经更新了代码。查看手册页,我认为它来自这里:sys/types.h
unistd.h
你不应该传递 0 来选择,而是你拥有的最大 FD:select(server_socket, &copy, ...
。自从我上次使用select
以来已经十多年了,所以我不确定这是不是唯一的问题
另外,给select()
一些超时可能更安全,并确保函数在某个时候返回。
我忘了+1,select(server_socket + 1, ....
【参考方案1】:
Here is the manual of select.
第一个参数不应为零,而是选择应管理的最高文件描述符加 1。在您的情况下是:
int socket_count = select(server_socket + 1, ©, nullptr, nullptr, nullptr);
【讨论】:
以上是关于控件不会移动到选择功能旁边的主要内容,如果未能解决你的问题,请参考以下文章
更改 ListBox 选择不会将更改从 BindingSource 移动到 DataSet