2011-08-04 226 views
4

我編寫通過Linux TCP套接字進行通信的網絡應用程序。最近我已經注意到發送系統調用會導致應用程序崩潰。當兩個同伴都起來時它工作正常(我正在測試崩潰恢復)。但是,當一個同伴下來第二次崩潰執行這段代碼。Linux TCP套接字崩潰

fprintf(stderr, "out_tcp %d\n", out_tcp); 
    if(send(out_tcp, &packet, sizeof(packet), 0) == -1) 
     fprintf(stderr, "send TCP error"); 
    fprintf(stderr, "after send"); 

套接字已經準備並連接並且在第二個對等關閉之前執行了好幾次。我期望這個代碼返回-1值,但它只在輸出產生「out_tcp 11」,然後應用程序退出。沒有錯誤消息,沒有從發送返回的值。我在Valgrind下運行它,它說應用程序正常退出 - 沒有錯誤/警告消息。

有沒有人有任何想法如何調試它?使用的工具?因爲我沒有收到任何信息,所以我很困惑。

在此先感謝 Harnen

+1

您使用的信號能夠幫助?你用'gdb'檢查過它嗎? –

+1

Valgrind?這不是內存泄漏,在'gdb'下運行它。您可能因'SIG_PIPE'而退出。 –

+2

[如何防止SIGPIPE或防止服務器結束?](http://stackoverflow.com/questions/6821469/how-to-prevent-sigpipe-or-prevent-the-server-from-ending) –

回答

0

您是否嘗試過RTFM(可閱讀手冊)錯誤情況?你是否抓住或忽略任何信號? errno全局變量呢?

man send 

而且還TCP是流協議,因此建議使用常用的流式訪問的命令如read(),write()方法,如果你不需要任何特殊的標誌。

+0

我做到了。當發送沒有返回並且應用程序退出時,執行任何操作(檢查errno)都有點困難... – harnen

1

解決: USE MSG_EORMSG_NOSIGNALflag在發送功能如下

if(send(out_tcp, &packet, sizeof(packet), **MSG_EOR|MSG_NOSIGNAL**) == -1) 

希望它