linux中send函数MSG_NOSIGNAL异常消息
最近2周在做 ineedle 的國(guó)舜項(xiàng)目擴(kuò)展,需要使用 socket 的 tcp 連接向?qū)Ψ桨l(fā)送消息,當(dāng)然需求很簡(jiǎn)單,只是按照對(duì)方要求發(fā)送指定格式的消息,程序結(jié)構(gòu)也非常的簡(jiǎn)單,一對(duì)多的 client/server 模型,ineedle 發(fā)送給多個(gè)服務(wù)器消息。我們這邊在分析出結(jié)果,封裝為相應(yīng)格式消息后發(fā)送給對(duì)方,只需要在線程循環(huán)發(fā)送消息即可,便在測(cè)試環(huán)境中編寫簡(jiǎn)單的socket進(jìn)行模擬消息發(fā)送,一對(duì)一發(fā)送,能夠正常發(fā)送消息。可以遇到了一個(gè)棘手的問題:在服務(wù)器端用ctrl+c 來結(jié)束服務(wù)器接收進(jìn)程來模擬服務(wù)器宕機(jī)的情況,結(jié)束服務(wù) socket 進(jìn)程之后,服務(wù)端自然關(guān)閉進(jìn)程,可是 client 端也竟然出乎意料的關(guān)閉掉。
這就奇怪了,我在服務(wù)端關(guān)閉進(jìn)程,服務(wù)器會(huì)關(guān)閉 tcp 連接,向 client 發(fā)送FIN包,client 響應(yīng) ack 后,等雙向 tcp 連接關(guān)閉后,tcp 連接徹底關(guān)閉,在 client 端發(fā)送消息會(huì)失敗,返回錯(cuò)誤信息,錯(cuò)誤消息會(huì)被正常的打印出來,可是很多時(shí)候錯(cuò)誤信息都沒有打印( write 函數(shù)沒有返回),有時(shí)候返回了錯(cuò)誤信息,但是 client 端進(jìn)程仍然無辜死掉,我的 client 端可是用的 while(1) 死循環(huán)啊,怎么可能。于是乎百度了一番,說法千奇百怪,有說防火墻的問題,關(guān)閉防火墻仍然如此。郁悶 ing,測(cè)試了其它方法都不行,打印出錯(cuò)誤錯(cuò)誤碼,也沒有查詢到結(jié)果。
最后問了下我們的張總,問題剛給他說完,他便說他以前也遇到這個(gè)問題,給我找到了他以前的解決方案。解決方法是使用 send 函數(shù)時(shí)候在最后一個(gè)參數(shù)上加 MSG_NOSIGNAL 標(biāo)記即可。于是自己更改發(fā)送函數(shù) write 為 send 并添加 MSG_NOSIGNAL 標(biāo)志,重新編譯,運(yùn)行,中斷 server,果然這個(gè)問題被很瀟灑的解決了,感謝張總的英明神武。
?
參考一個(gè)博文的介紹
Linux 下當(dāng)連接斷開,還發(fā)送數(shù)據(jù)的時(shí)候,不僅 send() 的返回值會(huì)有反映,而且還會(huì)向系統(tǒng)發(fā)送一個(gè)異常消息,如果不作處理,系統(tǒng)會(huì)出 BrokePipe,程序會(huì)退出,這對(duì)于服務(wù)器提供穩(wěn)定的服務(wù)將造成巨大的災(zāi)難。為此,send() 函數(shù)的最后一個(gè)參數(shù)可以設(shè)置為 MSG_NOSIGNAL,禁止 send() 函數(shù)向系統(tǒng)發(fā)送常消息。
轉(zhuǎn)載于:https://www.cnblogs.com/liwei0526vip/p/5019413.html
總結(jié)
以上是生活随笔為你收集整理的linux中send函数MSG_NOSIGNAL异常消息的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WebQQ hash加密算法PHP版
- 下一篇: 微信程序概要