控件不会移动到选择功能旁边

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, &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

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

【问题讨论】:

你的select() 函数来自哪里?您可以尝试使用调试器来查看程序卡在函数中的哪个位置 我已经更新了代码。查看手册页,我认为它来自这里:sys/types.hunistd.h 你不应该传递 0 来选择,而是你拥有的最大 FD:select(server_socket, &amp;copy, ...。自从我上次使用select 以来已经十多年了,所以我不确定这是不是唯一的问题 另外,给select()一些超时可能更安全,并确保函数在某个时候返回。 我忘了+1,select(server_socket + 1, .... 【参考方案1】:

Here is the manual of select.

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

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

【讨论】:

以上是关于控件不会移动到选择功能旁边的主要内容,如果未能解决你的问题,请参考以下文章

更改 ListBox 选择不会将更改从 BindingSource 移动到 DataSet

按钮不会移动到 EditText 旁边

IOS辅助功能选择的标记不移动

选择 2 标记移动到上一行

visio 2010 , 我在复制一个控件的时候,那个控件旁边的一些其他控件也会跟着复制过来

duilib 修复combo控件打开下拉菜单后不会自动定位到上次选择的位置上的bug