gpt4 book ai didi

c - 如果队列中的客户端无序停止,为什么单进程C服务器会停止?

转载 作者:行者123 更新时间:2023-11-30 17:11:48 26 4
gpt4 key购买 nike

我有一个简单的 C 语言单进程服务器。它绑定(bind)并监听端口 k,并且旨在一次仅接受一个客户端。为此,我将 listen() backlog 设置为 0,但我仍然发现客户端在队列中等待,并且当客户端在其之前启动时,它们会得到 accept()-ed终止。为什么?

其次,我依次启动客户端:c1c2c3c4;并在终止c1之前终止c2。客户端c1仍然可以与服务器聊天。有趣的是,我发现当我终止 c1 时,服务器也会停止。 (因此,客户端 c3c4 报告 read() 错误。)知道服务器为何停止吗?

当我按顺序终止客户端时,它工作正常。如果所有客户端都按顺序终止,服务器将等待 accept() 新客户端。服务器是否“记住”客户端的顺序? (虽然listen() backlog是0?即便如此,为什么服务器会停止呢?)

第三,我再次尝试了这两种情况,并将 listen() backlog 设置为 INT_MAX。可以看到相同的行为。

这是我的代码的要点:

s = socket(…);
bind(…);
listen(s, 0);
while(to_serve_or_not_to_serve) {
client = accept(s, …);
if(client<0){
perror("Client not accepted");
continue;
}

serve_this_client:
r = read(client, buffer, …);
if(r<0) {
write(client, "You're dead!~\n", 14);
close(client);
continue;
}
// process some data
w = write(client, data, …);
if(w<0) {
write(client, "Your dead ペン!~\n", 15);
close(client);
continue;
}
goto serve_this_client;
}
close(s);

[如果您需要更多详细信息,请告诉我。]

最佳答案

For that, i set the listen() backlog to 0, but i still find clients waiting in queue, and they get accept()-ed when the client started before it terminates. Why?

因为backlog参数不会被内核设置为0。该参数只是建议性的,系统可能会使用不同的值。欲了解更多详情,请参阅listen() ignores the backlog argument?

i start up clients one after another as c1, c2, c3, c4; and terminate c2 before terminating c1. Client c1 can still chat with the server. Interestingly, i find that when i terminate c1, the server stops as well.

终止 c1 后,下一个 accept 将失败,因为与 c2 的新连接已经关闭。但是您不会处理接受失败的情况,而是继续使用无效的 fd。

关于c - 如果队列中的客户端无序停止,为什么单进程C服务器会停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31997277/

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