gpt4 book ai didi

c - 在关闭的连接上写入不会立即生成 sigpipe

转载 作者:太空宇宙 更新时间:2023-11-04 12:08:56 24 4
gpt4 key购买 nike

我在 C 上的服务器/客户端有这个问题。如果我在 SIGINT 后关闭服务器套接字,然后我尝试从客户端写入这个关闭的连接,我必须先写两次客户端生成 SIGPIPE。它不应该立即生成吗?这是正常行为还是我需要解决的问题?这是我的代码。我正在同一台 PC 上通过 127.0.0.1 连接的 ubuntu 上进行测试。

服务器.c

sigset_t set;
struct sigaction sign;
int sock_acc;
int sock;

void closeSig(){
close(sock_acc);
close(sock);
exit(1);
}


int main(){
sigemptyset(&set);
sigaddset(&set, SIGINT);
sig.sa_sigaction = &closeSig;
sig.sa_flags = SA_SIGINFO;
sig.sa_mask = set;
sigaction(SIGINT, &sig, NULL);
//other code to accept the connection from the client
sigprocmask(SIG_UNBLOCK, &set, NULL);
//write/read calls
}

客户端.c

void closeSigPipe(){
close(ds_sock);
printf("Stop...");
exit(1);
}

int main(){
sigpipe.sa_sigaction = &closeSigPipe;
sigpipe.sa_flags = SA_SIGINFO;
sigaction(SIGPIPE, &sigpipe, NULL);
//other code to connect the server, and write/read calls
}

问题是,当我用 CTRL+C 关闭服务器终端时,第一次从客户端写入连接没有任何问题... perror("Error:");打印“成功”...

最佳答案

TCP 协议(protocol)没有为接收方提供一种方式来告诉发送方它正在关闭连接。当它关闭连接时,它会发送一个 FIN 段,但这只是意味着它已完成发送,而不是它无法再接收。

发送方检测连接已关闭的方式是尝试发送数据,接收方发回一个RST段作为响应。但是写入套接字不会等待响应,它只是将数据排队并立即返回。当接收到 RST 时会出现信号,这将在很短的时间内发生。

您必须进行两次写入的原因可能是因为 Nagle's Algorithm .为避免过多的网络开销,TCP 尝试将短消息组合成一个段。维基百科页面包含一些解决方法。

关于c - 在关闭的连接上写入不会立即生成 sigpipe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49634924/

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