2013-03-13 118 views
5

正如標題所說,在面向連接的套接字上一次可寫入的字節數是否有限制?一次可以在TCP套接字上寫多少個字節?

如果我要發送的緩衝,例如,1024個字節,我可以用一個

write(tcp_socket, buffer, 1024); 

,或者我應該使用多個write()電話與每一個字節的低量?

+0

可能的[C++套接字編程TCP最大規模的http://stackoverflow.com/a/12934115/1758762 – duDE 2013-03-13 11:55:39

+0

可能重複重複/ ip socket Buffer?](http://stackoverflow.com/questions/12931528/c-socket-programming-max-size-of-tcp-ip-socket-buffer) – 2013-03-14 23:26:00

回答

9

write()並不保證所有字節都將被寫入,因此需要多次調用write()。從man write

寫入可以小於字節的比計數如果,例如,有底層物理介質上的空間不足,或RLIMIT_FSIZE資源限制遇到的數量(見的setrlimit(2)) ,或者在寫入少於計數字節之後,調用被信號處理程序中斷。 (參見配管(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; 
} 
+0

所以我可以使用任何'size',然後我必須檢查返回值。這樣對嗎? – JustTrying 2013-03-13 11:58:12

+1

@JustTrying,更新了示例代碼。 – hmjd 2013-03-13 12:01:33

+1

爲什麼你把'assert()'放在那裏?怎麼可能達到這個條件? – Mike 2013-03-13 12:23:23

-1

如您所見write socket最大緩衝區大小爲1048576字節。

+0

不需要請重新閱讀你的源代碼。這是* z/TPF上的最大*套接字發送緩衝區大小*,無論如何。它不是你可以在一個'send()'或'write()'中發送的最大數據量,它只受限於指定長度的int的最大值。 – EJP 2013-03-14 01:36:17

0

沒有固有的限制。 TCP/IP將根據需要對數據包進行分段和重組。您的系統可能會施加(可能可調)的上限,但它可能在多MB範圍內。請參閱您的手冊頁中的setsockopt()並始終檢查write()的返回值。

0

您可以編寫的實際金額取決於套接字的類型。通常,您需要檢查返回值以查看實際寫入的字節數。寫入的字節數可能會有所不同,具體取決於套接字是否處於阻止模式。

另外,如果套接字被阻塞,您可能不想等待所有數據一次寫入。您可能需要一次編寫一些代碼,以便在寫入操作之間進行其他操作。

0

從我的經驗,最好是留在1024字節的限制