2013-04-25 79 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