![](/img/trans.png)
[英]After doing nn_send, the nn_socket will forbid to send the next piece of data immediately in a Req/Rep mode
[英]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.