簡體   English   中英

我可以在阻塞模式下send()之后立即釋放數據嗎?

[英]Can I free my data immediately after send() in blocking mode?

文檔說要發送:

當消息不適合套接字的發送緩沖區時,除非套接字已置於非阻塞I / O模式,否則send()通常會阻塞。 在非阻塞模式下,在這種情況下它將返回EAGAIN。 select(2)調用可用於確定何時可以發送更多數據。

我處於阻止模式,正在執行以下操作:

buf = malloc(size);

send (socket, buf, size);

free(buf)

假設它非常大,一次大於緩沖區可以容納的大小(因此,需要進入緩沖區,因為兩個塊可以說)。 無論如何,在發送后我進入的阻止模式下,我是否可以安全地完全復制或處理數據並刪除數據?

在阻塞模式下, send塊直到I / O完成或觸發錯誤。 您應該檢查返回的值,因為send操作不能保證發送的字節數與作為第三個參數傳遞的字節數相同。

只有當send返回的值等於已發送緩沖區的大小時,您才能確保整個塊都已復制到內核內存中,或已通過設備內存傳遞,或已發送至目的地。

簡短的答案是:是的,當文件描述符處於阻塞模式時,可以在send()調用成功返回(無錯誤)之后釋放緩沖區。

這樣做的原因是基於阻塞概念本身:send()調用(針對阻塞文件描述符)僅在發生錯誤或底層中緩沖或傳輸的buf請求的數據size字節返回時返回。操作系統(通常是內核)。

還要注意,成功返回send()並不表示已傳輸數據。 這意味着它至少被底層緩沖了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM