c
  • sockets
  • 2012-04-25 52 views 0 likes 
    0

    我有關於TCP套接字發送()的問題。套接字發送()可重複

    有沒有之間的差異:

    char *text="Hello world"; 
    char buffer[150]; 
    
    for(i=0;i<10;i++) 
        send(fd_client, text, strlen(text)); 
    

    char *text="Hello world"; 
    char buffer[150]; 
    
    buffer[0]='\0'; 
    for(i=0;i<10;i++) 
        strcat(buffer, text); 
    
    send(fd_client, buffer, strlen(buffer)); 
    

    是否有使用的recv接收側的區別嗎? 都將是一個TCP數據包?

    即使設置了TCP_NODELAY?

    回答

    0

    真的沒辦法知道。取決於TCP的實施。如果它是一個UDP套接字,它們肯定會有不同的結果,在第一種情況下你會有幾個數據包,而在第二種情況下會有一個數據包。

    TCP可以自由分割數據包,因爲它認爲合適;它模擬一個流並將它的分組機制從用戶中抽象出來。這是設計。

    0

    TCP是基於流的協議。如果您運行發送,它會將一些數據放入OS TCP層緩衝區,OS會定期發送。但是如果你調用Send太快,它可能會在發送前一個數組之前將少數數組放入OS TCP層。所以它就像堆棧一樣,它發送任何東西,並將所有東西放在一個大陣列中。
    通過操作系統TCP層進行分段發送,Nagle的算法可以防止在OS緩衝區大到足以滿足一個段大小之前發送少量數據。

    所以是的,有區別。

    TCP是基於流的協議,你不能依靠單一的發送將單個接收相同數量的數據。
    數據可能會合並在一起,你必須始終記住這一點。

    順便說一句,根據你的例子,在第一種情況下,客戶端將一起接收所有字節,或者什麼也不收。與此同時,如果發送一個大的段會丟在路上,那麼服務器操作系統會自動重新發送它。丟棄更大數據包的機會更高,因此重新發送大型數據包會導致一些流量丟失。但這是基於丟棄數據包的百分比,可能根本不適合您的情況。

    在第二個示例中,您可能會一起收到所有內容或者每個單獨或部分合並的部分。你永遠不知道,應該以這種方式實現你的網絡閱讀,你知道你期望接收和讀取的字節數量有多少字節。這樣即使留下了一些未讀字節,它們也會在下一個「讀取」時被讀取。

    相關問題