【问题标题】:Number of TCP connections after close() and exit() callsclose() 和 exit() 调用后的 TCP 连接数
【发布时间】:2018-01-21 16:32:24
【问题描述】:
pid_t pid;
int listenfd, connfd;
listenfd = socket(...);
bind(listenfd, ...);
listen(listenfd, 5);
connfd = accept(listenfd, ...);
if ((pid = fork()) == 0){
    close(listenfd);
    doit(connfd); /* processes the clients request*/
    close(connfd);
    exit(0);
}
wait(...)

调用等待函数后,我会有多少个 TCP 连接? 我认为它应该是 0,但我真的不知道 close() 函数的作用。它是关闭每个进程还是只关闭一个进程(子进程或父进程)? 谢谢!

【问题讨论】:

  • 据我所知,在 fork 之后,所有打开的文件描述符都没有O_CLOEXEC 标志将被复制并出现在父进程和子进程中,并且每个进程都需要分别关闭他的描述符。也就是说,在 fork 之后,您最终会在每个进程中得到 4 个描述符 - listenfdconnfd。每个进程都需要关闭它们。
  • 是的,但是 4 个文件描述符不等于 4 个 TCP 连接,对吧?
  • 所以在wait线TCP连接仍然由服务器持有。因为它还没有关闭连接套接字。
  • 在您显示的代码中connfd 的任何副本是否涉及对shutdown() 的调用?
  • 我想不会。这是来自考试的,你所拥有的只是这段代码和问题。没有别的了。

标签: c linux sockets networking tcp


【解决方案1】:

一个accept()的成功调用建立了一个连接。对于 阻塞 侦听套接字,它返回 已连接 套接字*1

分叉后,服务器使用其已连接套接字connfd 的副本引用此一个 连接。

然后进程分叉,第二个进程持有connfd 的副本。

这两个套接字描述符都指向相同的连接。

listening 套接字从不真正指代连接。它只是一种传感器,用于列出传入的请求。)

*1对于一个 unblocking 监听套接字,事情在时间方面有点不同。在这种情况下,可能是在accept() 返回的那一刻连接设置尚未完全完成。


所以回答你的问题:

调用wait函数后我会有多少个TCP连接?

在对wait() 的调用之后,仅引用已建立的连接accept() 的两个套接字描述符的一份副本是close()d。另一个仍然“保持”连接。

假设代码没有在任何地方调用 shutdown() 或使任何套接字解除阻塞,稍微调整一下代码,模式通常如下所示:

listenfd = socket(...);
bind(listenfd, ...);
listen(listenfd, 5);

connfd = accept(listenfd, ...);

/* Connection is up. */

if ((pid = fork()) == 0)
{
  /* Connected child process here */

  close(listenfd); /* Close the connected processes's listening listenfd 
                      as it never uses it. */
  doit(connfd); /* Processes the clients request. */

  close(connfd);

  exit(0);
}

/* Listening parent process here */

close(connfd) /* Close the accepting process' connected connfd 
                 as it never uses it. */
wait(...)

/* Definitely no connection here any more */

【讨论】:

  • 非常感谢!现在说得通了,因为我不太明白调用 close() 函数时关闭了什么。
猜你喜欢
  • 1970-01-01
  • 2014-04-05
  • 1970-01-01
  • 2016-05-07
  • 1970-01-01
  • 2013-12-09
  • 1970-01-01
  • 1970-01-01
  • 2013-07-17
相关资源
最近更新 更多