2013-04-25 57 views
0

我写TCP服务器程序(Linux下C)TCP服务器程序的TCP连接,并在主机B如何杀死在如果没有FIN/ACK或RST接收

运行它,如果主机A建立与TCP连接主机B

则没有发送关闭FIN/ACK

我怎么写TCP服务器里面的源代码,以杀死这个TCP连接?

使用原始套接字来制作假的RST?

或其他方式?

谢谢!

回答

1

只要close()服务器的套接字一旦确定连接不再可用。最终,套接字将在内部超时并开始向读/写操作报告错误,然后您可以关闭它。如果你不想等待那么长时间,那么在你自己的代码中实现一个超时,或者作为协议中的keepalive/ping命令,或者是一个简单的计时器,记录客户端最后一次与服务器交换任何数据的时间。如果超时时间到期,则关闭套接字而不管其实际状态如何。

0

我不知道在这种情况下,但如果你创建的所有打开的连接二进制文件:

FILE *ptr_myfile; 
ptr_myfile=fopen("test.bin","wb"); //opened sockets 
//.. your code .. 
sockfd[k] = socket(AF_INET, SOCK_STREAM, 0); 
fwrite(&sockfd[k], sizeof(sockfd[k]), 1, ptr_myfile_soc); 
//.. your code .. 
close(ptr_myfile); 

,如果主机A关闭时不发送FIN/ACK,在其他可执行你会从文件中读取并关闭相关的插座:

fread(&sockfd[k],sizeof(sockfd[k]),1,ptr_myfile_soc); 
printf("closing %d \n",k); 
close(sockfd[k]); 
+0

这似乎只是一个方式,让所有打开的套接字的轨道,但我觉得OP就想办法理解*其中*连接已被终止,*当*时,而不是记住所有的方法。顺便说一下,你为什么要把它们保存到一个文件?如果程序意外结束,文件的好处是它的持久性。但是如果发生这种情况,所有连接都会被操作系统关闭,所以我没有看到将它们保存到文件中的意义。 – 2017-10-26 23:55:21