gpt4 book ai didi

c - 当在循环中突然退出 C 程序时,为什么会发生额外的循环迭代?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:33:55 29 4
gpt4 key购买 nike

考虑下面的基本客户端和服务器程序(只是骨架/说明我的问题)。客户端启动与服务器的连接,提示用户输入消息,然后发送到服务器并打印到屏幕。

如果我在循环中间突然退出客户端程序(例如通过关闭终端窗口),有时客户端会继续循环循环一段时间(即发送到服务器的最后一条消息/当前驻留在客户端关闭时的写缓冲区中,重复发送到服务器,通常直到循环耗尽)。然而,其他时候,服务器上的 read() 调用会正确返回 0,并且连接会毫无问题地关闭(行为似乎相当随机)。

我不太明白这是怎么回事。首先,为什么程序关闭后会出现额外的循环迭代?终端窗口关闭与实际进程本身结束之间是否存在延迟时间?即使确实发生了额外的循环迭代,在用户输入消息之前,对 fgets() 的调用是否应该阻塞?

我在 XFCE 桌面上使用 Fedora 25 工作站。

我尝试搜索这方面的信息,但运气不佳(我不确定如何以简洁的方式搜索它)。非常感谢任何帮助。

谢谢

客户:

#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>

int main(void) {
int sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(3000);
inet_pton(AF_INET, "127.0.0.1", &server.sin_addr);
connect(sockfd, (struct sockaddr *)&server, sizeof(server));

int i;
for (i = 0; i < 20; i++) {
char buf[512];
printf("Send a message: ");
fgets(buf, 512, stdin);
write(sockfd, buf, sizeof(buf));
}

close(sockfd);
}

服务器:

#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>

int main(void) {
int listenfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(3000);
inet_pton(AF_INET, "127.0.0.1", &server.sin_addr);
bind(listenfd, (struct sockaddr *)&server, sizeof(server));

listen(listenfd, 10);
printf("Listening...\n");

struct sockaddr_in client;
socklen_t client_size = sizeof(client);
int clientfd = accept(listenfd, (struct sockaddr *)&client, &client_size);

for (;;) {
char buf[512];
int i = read(clientfd, buf, sizeof(buf));

if (i == 0) {
close(clientfd);
printf("Connection Closed\n");
break;
} else {
printf("%s", buf);
}
}

close(listenfd);
}

最佳答案

当您的终端(以及连接到您进程的标准输入/输出/错误的 pty 设备的远程/主端)关闭时,fgets 将在 上看到文件结束状态>stdin,并将立即返回一个不完整的行(未以 \n 结尾)或根本没有输入(空返回值);实际上,它将是后者。如果您检查了结果,您会看到这一点并能够采取相应的行动。

关于c - 当在循环中突然退出 C 程序时,为什么会发生额外的循环迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43702579/

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