[英]How many bytes can I write at once on a TCP socket?
正如標題所說,在面向連接的套接字上一次可以寫入的字節數是否有限制?
如果我想發送一個緩沖區,例如1024字節,我可以使用a
write(tcp_socket, buffer, 1024);
或者我應該為每個使用較少字節數的多個write()
調用?
write()
不保證將寫入所有字節,因此需要多次調用write()
。 從男人寫 :
例如,如果底層物理介質上沒有足夠的空間,或者遇到RLIMIT_FSIZE資源限制(請參閱setrlimit(2)),或者調用被信號處理程序中斷,則寫入的字節數可能小於count。寫得少於計數字節。 (另見管道(7)。)
write()
返回寫入的字節數,因此必須保留寫入的字節的運行總數,並將其用作buffer
的索引並計算要寫入的剩余字節數:
ssize_t total_bytes_written = 0;
while (total_bytes_written != 1024)
{
assert(total_bytes_written < 1024);
ssize_t bytes_written = write(tcp_socket,
&buffer[total_bytes_written],
1024 - total_bytes_written);
if (bytes_written == -1)
{
/* Report failure and exit. */
break;
}
total_bytes_written += bytes_written;
}
沒有固有的限制。 TCP / IP將根據需要對數據包進行分段和重組。 您的系統可能會施加(可能是可調的)上限,但它可能在多MB范圍內。 有關setsockopt()的信息,請參見您的聯機幫助頁,並始終檢查write()的返回值。
您可以寫入的實際數量取決於套接字的類型。 通常,您需要檢查返回值以查看實際寫入的字節數。 寫入的字節數可以根據套接字是否處於阻塞模式而變化。
此外,如果套接字阻塞,您可能不想等待所有數據一次寫入。 您可能希望一次寫一些,以便能夠在寫操作之間進行其他操作。
根據我的經驗,最好保持1024字節的限制
如您所見, 寫入套接字的最大緩沖區大小為1048576字節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.