日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

linux中send函数MSG_NOSIGNAL异常消息

發布時間:2023/12/13 综合教程 28 生活家
生活随笔 收集整理的這篇文章主要介紹了 linux中send函数MSG_NOSIGNAL异常消息 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近2周在做 ineedle 的國舜項目擴展,需要使用 socket 的 tcp 連接向對方發送消息,當然需求很簡單,只是按照對方要求發送指定格式的消息,程序結構也非常的簡單,一對多的 client/server 模型,ineedle 發送給多個服務器消息。我們這邊在分析出結果,封裝為相應格式消息后發送給對方,只需要在線程循環發送消息即可,便在測試環境中編寫簡單的socket進行模擬消息發送,一對一發送,能夠正常發送消息。可以遇到了一個棘手的問題:在服務器端用ctrl+c 來結束服務器接收進程來模擬服務器宕機的情況,結束服務 socket 進程之后,服務端自然關閉進程,可是 client 端也竟然出乎意料的關閉掉。

這就奇怪了,我在服務端關閉進程,服務器會關閉 tcp 連接,向 client 發送FIN包,client 響應 ack 后,等雙向 tcp 連接關閉后,tcp 連接徹底關閉,在 client 端發送消息會失敗,返回錯誤信息,錯誤消息會被正常的打印出來,可是很多時候錯誤信息都沒有打印( write 函數沒有返回),有時候返回了錯誤信息,但是 client 端進程仍然無辜死掉,我的 client 端可是用的 while(1) 死循環啊,怎么可能。于是乎百度了一番,說法千奇百怪,有說防火墻的問題,關閉防火墻仍然如此。郁悶 ing,測試了其它方法都不行,打印出錯誤錯誤碼,也沒有查詢到結果。

最后問了下我們的張總,問題剛給他說完,他便說他以前也遇到這個問題,給我找到了他以前的解決方案。解決方法是使用 send 函數時候在最后一個參數上加 MSG_NOSIGNAL 標記即可。于是自己更改發送函數 write 為 send 并添加 MSG_NOSIGNAL 標志,重新編譯,運行,中斷 server,果然這個問題被很瀟灑的解決了,感謝張總的英明神武。

參考一個博文的介紹

Linux 下當連接斷開,還發送數據的時候,不僅 send() 的返回值會有反映,而且還會向系統發送一個異常消息,如果不作處理,系統會出 BrokePipe,程序會退出,這對于服務器提供穩定的服務將造成巨大的災難。為此,send() 函數的最后一個參數可以設置為 MSG_NOSIGNAL,禁止 send() 函數向系統發送常消息。

總結

以上是生活随笔為你收集整理的linux中send函数MSG_NOSIGNAL异常消息的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。