2013-05-01 137 views
1

在tcp客戶端程序中使用connect()或在tcp服務器程序中接受() 許多可能的異常發生 例如,TCP SYN或TCP SYN/ACK丟失或一些其他錯誤如果connect()失敗,則繼續執行connect(),如果accept()失敗,則接受()

(順便說一句,我想知道,如果TCP SYN是地段,將連接()重新發送TCP SYN或只是產生一個錯誤?)

後容易源代碼等

if(connect()<0){ 
... 
exit(1); 
} 

if (accept()<)){ 
... 
exit(1); 
} 

但是,如果我想嘗試連接()或再次接受(), 是有可能或沒有? 像

while(connect()<0){ 
     continue; 
} 

while(accept()<0){ 
     continue; 
} 

將這樣的交易產生不可接受的後果?

此外send()和recv() 怎麼樣謝謝!

+0

優雅與它無關。問題是,你的功能要求是什麼? – EJP 2013-05-01 22:48:57

回答

0

一般一旦acceptconnect失敗,它們將總是失敗,所以你的while循環在失敗時只是無限循環。有一些例外情況(非阻塞套接字在EINPROGRESS或EAGAIN中失效),但通常當出現錯誤時,您需要檢查錯誤代碼並執行相應的操作,例如關閉套接字並打開一個新套接字。

+0

如何在丟失TCP SYN的情況下,將connect()函數重傳? – misteryes 2013-05-01 21:30:45

+0

編號'connect()'失敗並不意味着一個'SYN'數據包超時。 'connect()'失敗意味着該包的所有*重傳失敗。您無需編寫任何代碼就可以使平臺TCP堆棧簡單地完成其工作。 – Glyph 2013-05-01 21:39:53

+0

那麼send()recv(),fork()失敗怎麼樣?如果他們失敗了,這意味着我需要關閉這個套接字或退出程序? – misteryes 2013-05-02 12:22:32