2014-01-12 113 views
0

我有一個實時系統,所以我用非阻塞套接字發送我的數據 但是發生了套接字緩衝區已滿,所以發送函數的返回值小於我的數據長度。我可以獲得套接字緩衝區剩餘大小嗎?

如果我保存返回長度並重新發送,與阻塞套接字沒有什麼不同嗎?

所以我可以得到套接字緩衝區的剩餘大小?我可以先檢查, 如果它足夠,那麼我打電話發送,跳過發送其他。

謝謝大家。

+0

操作系統:ubuntu 13.04 64位 – neko

回答

1

那麼,阻塞和非阻塞之間是有區別的 - 如果你遇到一個短的寫你不會阻止。這是非阻塞的重點。它讓你有機會在等待一些緩衝空間釋放時做更多的事情。

您的擔心似乎是反覆嘗試寫出完整的訊息,即輪詢的一種形式。但是檢查緩衝區中的空閒字節是同樣的事情,你只需要調用write來調用可用性即可。你真的不明智地獲得任何效率。

對此的常見解決方案是使用類似selectpoll的內容來監視套接字描述符以寫入(以及最少一些)字節的能力。這使您可以停止輪詢並強化內核中的某些工作,以監視您的空間可用性。

也就是說,如果你真的想檢查,看看有多少空間可以有平時的工作,往往會有些特殊的平臺,主要是ioctl電話與各平臺的具體參數,如FIONWRITESIOCOUTQ,等你需要變通來調查你的平臺提供了什麼。但是,最好再考慮一下,如果這真的是你首先需要的東西。

+0

感謝您的回覆,我已經使用了select()函數。由於我的系統是一個實時系統,因此數據將持續不斷。 我需要儘快處理它們(調用send())。 因此,如果緩衝區大小不夠,我可以跳過這些數據,這不會破壞我的系統。但是,如果只發送部分數據並丟棄剩餘數據,則會破壞我的系統。 所以我問這個問題。 – neko

+0

好的,我明白了。您可能希望將這些信息納入您的問題並指定您正在使用的操作系統。 – Duck

+0

嗨,似乎ubuntu不支持FIONWRITE既不是SIOCOUTQ,因爲它不是C標準庫?我能爲它做些什麼? – neko

相關問題