我有一個實時系統,所以我用非阻塞套接字發送我的數據 但是發生了套接字緩衝區已滿,所以發送函數的返回值小於我的數據長度。我可以獲得套接字緩衝區剩餘大小嗎?
如果我保存返回長度並重新發送,與阻塞套接字沒有什麼不同嗎?
所以我可以得到套接字緩衝區的剩餘大小?我可以先檢查, 如果它足夠,那麼我打電話發送,跳過發送其他。
謝謝大家。
我有一個實時系統,所以我用非阻塞套接字發送我的數據 但是發生了套接字緩衝區已滿,所以發送函數的返回值小於我的數據長度。我可以獲得套接字緩衝區剩餘大小嗎?
如果我保存返回長度並重新發送,與阻塞套接字沒有什麼不同嗎?
所以我可以得到套接字緩衝區的剩餘大小?我可以先檢查, 如果它足夠,那麼我打電話發送,跳過發送其他。
謝謝大家。
那麼,阻塞和非阻塞之間是有區別的 - 如果你遇到一個短的寫你不會阻止。這是非阻塞的重點。它讓你有機會在等待一些緩衝空間釋放時做更多的事情。
您的擔心似乎是反覆嘗試寫出完整的訊息,即輪詢的一種形式。但是檢查緩衝區中的空閒字節是同樣的事情,你只需要調用write來調用可用性即可。你真的不明智地獲得任何效率。
對此的常見解決方案是使用類似select
或poll
的內容來監視套接字描述符以寫入(以及最少一些)字節的能力。這使您可以停止輪詢並強化內核中的某些工作,以監視您的空間可用性。
也就是說,如果你真的想檢查,看看有多少空間可以有平時的工作,往往會有些特殊的平臺,主要是ioctl
電話與各平臺的具體參數,如FIONWRITE
,SIOCOUTQ
,等你需要變通來調查你的平臺提供了什麼。但是,最好再考慮一下,如果這真的是你首先需要的東西。
如果異步send
失敗,並且EWOULDBLOCK
/EAGAIN
,則不發送數據。然後您可以嘗試發送其他內容,或等到緩衝區再次釋放。
另請參閱https://stackoverflow.com/questions/19391208/when-a-non-blocking-send-only-transfers-partial-data-can-we-assume-it-would-r - 在此討論相關問題。
操作系統:ubuntu 13.04 64位 – neko