3年前。

This question was migrated from Unix & Linux Stack Exchange because it can be answered on Stack Overflow. Migrated
我制作了一个简单的tcp服务器,可以用telnet程序进行测试。
在windows上运行时,它可以正常工作,在linux上运行时,其行为很奇怪:
telnet客户端知道它们已连接到服务器,
服务器看不到客户端(select始终返回0),
当我关闭服务器时,客户端会检测到断开连接。
我想我漏掉了一些东西。
我错过了什么?
谢谢。
以下是程序源:
#include "headers.h"
#define DEFAULT_PORT 24891

/**
 * test_server [ip port]
 */
int main(int argc, char *argv[])
{
    sockaddr_in sin;
    socket_t sock;

    /* listening socket creation */
    sock = socket(AF_INET, SOCK_STREAM, 0);
    if (-1 == sock)
        { die("socket()"); }

    /* binding */
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = htonl(INADDR_ANY);
    sin.sin_port = htons(DEFAULT_PORT);
    if (3 == argc)
    {
        sin.sin_addr.s_addr = inet_addr(argv[1]);
        sin.sin_port = htons(strtol(argv[2], NULL, 0));
    }

    if (-1 == bind(sock, (sockaddr*) &sin, sizeof(sin)))
        { die("bind()"); }

    /* Listening */
    if (-1 == listen(sock, SOMAXCONN))
        { die("listen()"); }

    while (1)
    {
        timeval timeout = { 1, 0 };
        fd_set in_set;

        FD_ZERO(&in_set);
        FD_SET(sock, &in_set);

        // select the set
        int cnt = select(1, &in_set, NULL, NULL, &timeout);

        if (cnt > 0)
        {
            // ask if an event occurs on listening socket
            if (FD_ISSET(sock, &in_set))
            {
                /* a new client wants to connect */
                socket_t csock = accept(sock, NULL, NULL);

                send(csock, "hello\r\n", 7, 0);
                printf("new client!\n");

                close(csock);
            }
        }
        else if (cnt < 0)
            { die("select"); }

    }

    /* closing listen socket */
    close(sock);
    printf("socket closed\n");

    return 0;
}

最佳答案

您只需不正确地调用select。第一个参数需要是fdset中编号最高的fd,加上一个。参见手册页:

int select(int nfds, fd_set *readfds, fd_set *writefds,
           fd_set *exceptfds, struct timeval *timeout);
....

nfds is the highest-numbered file descriptor in any of the three sets,  plus 1.

代码可以工作,也可以不工作,这取决于“socket()”返回的fd。
在您的情况下,“nfds”的值需要是“sock+1”,通常在对多个fd进行选择时需要跟踪编号最高的fd。

关于linux - 为什么选择不告诉我客户端要连接?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35037274/

10-16 10:23