2013-06-26 133 views
1

這段代碼(C-Linux)有什麼問題?用套接字發送文件

我想從服務器接收文件,只要我有一個字節,我立即發送這個字節。但它不起作用。這一點很重要。

int Recv_File(int server,int client,char *buffer_ricezione,size_t dimensione_file){ 

    ssize_t nwritten,nread; 
    size_t n; 
    char c; 

    for (n=1; n<dimensione_file; n++) { 
     nread = recv(server,&c,1,0); 
     if (nread == 1) { 
      nwritten = send(client,&c,1,0); 
     }else{ 
      return -1; // chiudo connessione con il client 
     } 
    } 
    return 1; 
} 

感謝

+0

你應該緩衝區大小,所以用幾千字節的緩衝區調用'recv',你應該使用'poll'這樣的多路複用系統調用。閱讀http://advancedlinuxprogramming.com/ –

+0

你的意思是它沒有立即傳輸? TCP有自己的算法來決定如何將字節放在數據包中。如果是這種情況,你需要看看你的tcp選項。 – Duck

+0

關閉Nagle的算法(通過setsockopt(fd,IPPROTO_TCP,TCP_NODELAY))可以避免200mS的發送延​​遲,但是如果程序一次只發送一個字節,它會表現得很差,因爲每個字節都會自動分開網絡數據包。所以如果你關閉Nagle的話,一定要修改函數來發送每個send()調用多個字節! (理想的每呼叫大小將等於或略小於網絡的MTU大小;即以太網的1384字節) –

回答

0

也許,n應該從0開始

for (n=0; n<dimensione_file; n++) { 
    nread = recv(server,&c,1,0); 
    if (nread == 1) { 
     nwritten = send(client,&c,1,0); 
    }else{ 
     return -1; // chiudo connessione con il client 
    } 
} 
0

你可以嘗試這種方式,也buffer_ricezione將充滿傳輸數據。 讀取一個字節並一次發送一個字節並不好,浪費了大量資源。 你的代碼不會把任何東西放在接收緩衝區中,它假定保存傳輸的數據。

int Recv_File(int server,int client,char *buffer_ricezione,size_t dimensione_file){ 
// This code assumes that buffer_recezione has been allocated at least dimensione_file 

    ssize_t nwritten,nread; 
    size_t n; 
    // char c; 
    size_t bLeft=dimensione_file; 

    while (bLeft > 0) 
    { 
     nread = recv(server, buffer_ricezione, bLeft, 0); 
     if (nread > 0) { 
      if ((nwritten = send(client, buffer_ricezione, nread, 0)) != nread) 
      { 
        return -1; // impossible to send to the socket, quit 
      } 
      bLeft -=nread; 
      buffer_ricezione += nread; 
     }else{ 
      return -1; // chiudo connessione con il client 
     } 
    } 
    return 1; 
}