gpt4 book ai didi

c - close() 和 exit() 调用后的 TCP 连接数

转载 作者:可可西里 更新时间:2023-11-01 02:50:23 25 4
gpt4 key购买 nike

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() 函数的作用。它是关闭每个进程还是只关闭一个进程(子进程或父进程)?谢谢!

最佳答案

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

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

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

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

(监听套接字从未真正指代连接。它只是一种传感器,列出传入请求。)

*1对于一个解除阻塞的监听套接字,事情在时间上有点不同。在这种情况下,连接设置可能在 accept() 返回时没有完全完成。


所以回答你的问题:

How many TCP connections will I have after the call of the wait function?

在调用 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 */

关于c - close() 和 exit() 调用后的 TCP 连接数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48369054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com