0

在网络编程中,我在A和B之间建立了tcp连接时编写了2个TCP程序A和B,如果我想关闭它,我可以在A上使用以下代码片段:

int main(){
......    //blabla
shutdown(sockfd, SHUT_RDWR);
close(sockfd);
return;   // program finish
}

这样,socket 就会向 B 发送 FIN/ACK 并从 B 接收 ACK。我使用 tcpdump 抓包,我注意到只有从 A 到 B 的 FIN/ACK 和从 B 到 A 的 ACK,所以有只有2个步骤。但是对于tcp teardown,应该有4个步骤,从B到A的FIN / ACK和从A到B的ACK sebsequently。所以,它是不​​完整的。

所以我的问题是如何完成这 4 个步骤,因此,我想知道

1 程序 B 如何检测 A 是否发送了 SYN/ACK,如果 B 正在发送,n=recv();那么如果 n 是0,则表示 A 已经主动关闭。但是如果 B 空闲,如何检测?如果 B 正在做n=sendto(),我认为如果n<0,那么 A 会主动关闭,但我的测试似乎我的想法是错误的。

2 我怎样才能让程序A完成前4步的TCP拆解return(退出程序)

谢谢!

4

1 回答 1

0

A 进行了主动关闭。但是如果 B 空闲,如何检测

send据我所知,除非您执行/ recv(或等效项),否则您的流程不会得到通知。

  • Asend应该触发一个SIGPIPE信号或-1返回errno = EPIPE
  • Arecv应该返回 0 来表示 EOF

理想情况下,您的程序 (B) 应该已经在监视文件描述符的可用输入(可能使用select(2)poll(2)或等效的)。如果这样做,一旦对等端关闭其连接端,您正在监视的文件描述符将变得“有趣”以供读取,并且后续read将返回 0。

我个人建议epoll(2),但请记住它是特定于 Linux 的。

如何让程序 A 在返回前完成 TCP 拆解 4 个步骤(退出程序)

当您的进程终止时,操作系统所做的一件事就是关闭其所有文件描述符。这个过程的一部分也是关闭套接字,关闭套接字意味着关闭连接(你提到的最后两个部分)。

于 2013-04-17T17:46:52.997 回答