重用listen socket文件描述符的问题

时间:2015-01-23 16:41:30

标签: c sockets

我正在使用preforking概念。

当我在服务器中建立套接字时,返回的文件描述符值为7.我知道它将为文件描述符分配一个可用的数字。

当我使同一个子进程接受同一套接字上的新连接时,它不会accept()连接。

但是当我将文件描述符的值重置为7时,它开始接受连接。

我找不到背后的原因。任何人都可以对此有所了解。

我的代码与此类似

for (;;)
{
    int session_fd=accept(server_fd,0,0);
    if (session_fd==-1)
    {
        if (errno==EINTR) continue;
        die("failed to accept connection (errno=%d)",errno);

    }
    handle_session(session_fd);
    close(session_fd);
    server_fd = 7;

}

3 个答案:

答案 0 :(得分:3)

  

当我进行一些读写操作时,文件描述符的值会不断增加。

这没有意义,读取或写入应该在系统返回句柄的同一个套接字上执行。

  

所以我很想知道socket文件描述符值的重要性。

没有任何意义,它是一个特定于流程的句柄,由一个整数表示,通常每次打开和/或创建一个新的套接字时都会增加1等。

答案 1 :(得分:0)

我要出去试试看你的代码是like this,绑定server_fd,然后分叉一个孩子来处理每个连接。

如果是这样,值7并不意味着什么。恰好在程序的那个阶段,较低的数字已经在使用中。如果您在调用listen之前打开了其他一些文件或套接字,server_fd将有不同的编号。

套接字只是它的编号,因此当您reset the value of the file descriptor时,您正在从原始的绑定套接字读取,而不是accept调用产生的新套接字。而且我怀疑你不想两次在同一个插座上听,但我从未尝试过。

if (listen(server_fd,SOMAXCONN)) {
    die("failed to listen for connections (errno=%d)",errno);
}

for (;;) {
    int session_fd=accept(server_fd,0,0);
    if (session_fd==-1) {
        if (errno==EINTR) continue;
        die("failed to accept connection (errno=%d)",errno);
    }
    pid_t pid=fork();
    if (pid==-1) {
        die("failed to create child process (errno=%d)",errno);
    } else if (pid==0) {
        close(server_fd);
        handle_session(session_fd);
        close(session_fd);
        _exit(0);
    } else {
        close(session_fd);
    }
}

答案 2 :(得分:0)

很抱歉打扰你们。我找到了更改session_fd值的问题背后的原因。

session_fd是一个全局变量。由于它是一个巨大的遗留代码,我不知道session_fd的值被其他一些套接字改变了。

感谢所有人提供您的意见:)