簡體   English   中英

我可以在TCP套接字上一次寫入多少字節?

[英]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.

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