2011-04-12 72 views
0

編輯:原來是我的嵌入式以太網適配器的問題。現在運作良好。感謝大家。TCP Unix send()很慢C

當我通過TCP套接字發送文件時,傳輸完成需要很長時間(約1.5M字節約4秒)。相同的文件幾乎立即通過tftp傳播。我知道tftp使用UDP,這應該會更快,但我仍然認爲我的傳輸太慢了。我通過交叉電纜連接100Mbps半雙工。發送者是UNIX,接收者是Windows TcpClient上的.Net。

那麼,大家怎麼想?我需要更好的C代碼嗎?網絡可能有問題嗎?

這裏是我的C代碼:

int main(void) 
{ 
    //some initializing stuff 
    int AcceptSocket, ClientRecvSocket; 

    alen = sizeof(fsin); 
    int AcceptSocket = passiveTCP("20075", 10); 
    //Wait for client connections, and spawn a new thread to communicate with each one 
    pszRecvBuf = malloc((size_t) BUFSIZE); 
    while (1) 
    { 
     ClientRecvSocket = accept(AcceptSocket, &fsin, &alen); 
     printf("\nDebug: Accepted Connection\n"); 
     if (ClientRecvSocket < 0) 
     { 
      sprintf(szStr, "Error accepting client connection : %d", 
        ClientRecvSocket); 
      perror(szStr); 
     } 
     else 
     { 
      printf("\nDebug: Starting Thread\n"); 
      ThreadStatus = pthread_create(&ClientThread, NULL, ClientRecv, 
        (void *) &ClientRecvSocket); 
      pthread_join(ClientThread, NULL); 
     } 
    } 
} 

void *ClientRecv(void *ClientSocket) 
{ 
    pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); 
    int Socket = *(int *) ClientSocket; 

    unsigned char *file_buffer; 
    file_buffer = malloc(1572864 * sizeof(unsigned char)); 

    //set file data to something 

    SendLen = send(Socket, file_buffer, 1572864 * sizeof(unsigned char), 0); 
    shutdown(Socket, SHUT_RDWR); 
    free(file_buffer); 
} 
int passiveTCP(char *service, int qlen) 
{ 
    return passivesock(service, "tcp", qlen); 
} 
+2

'passiveTCP','AcceptSocket'等都是非標準的。我們甚至無法開始解決這個問題。 – 2011-04-12 21:45:11

+0

AcceptSocket是一個int。我沒有意識到被動TCP不是標準的。 – dunecat 2011-04-12 21:56:11

+1

在查看你的代碼之前,你應該使用'netcat',甚至'ftp'來確保你的網絡連接沒有問題。半雙工連接可能很難* – thkala 2011-04-12 22:03:46

回答

1

一目瞭然,看着它,你的函數ClientRecv內,你消耗太多的資源......

unsigned char *file_buffer; 
file_buffer = malloc(1572864 * sizeof(unsigned char)); 

你爲它分配內存,但它去了哪裏....應該嘗試釋放指向該緩衝區的指針....

作爲服務和幫助他人的利益的事情,是一種包裝你正在使用的框架,並請指定什麼樣的....因爲我強烈懷疑它是一個非標準的軟件,你正在使用 - 也許該軟件有一定的「問題」?

+0

我確實釋放了內存,這是我的代碼的簡化版本。 我沒有使用我知道的任何一種包裝。 – dunecat 2011-04-12 21:54:03

+1

小心顯示這些包裝的內部結構,比如什麼是'PassiveTCP',什麼是AcceptSocket/ClientRecvSocket ......它們聽起來有些複雜......並且不是標準的...... – t0mm13b 2011-04-12 21:58:02

+0

另外,在這種情況下,如果你說你確實釋放了記憶,請修改你的問題來指出,以免誤導別人浪費時間回答類似的問題......「我沒有在那裏看到自由......」等 – t0mm13b 2011-04-12 22:00:52

0

嘗試連接全雙工。由於TCP需要對每個傳輸數據包(大致)進行確認,因此您的半雙工鏈路將不得不停止傳輸以處理接收到的這些ACK。這可能表現爲衝突,導致數據包丟失並最終觸發TCP的擁塞控制。

+0

我正在使用的uClinix與我的全雙工需求不配合。 – dunecat 2011-04-12 21:59:05

+0

德國「全雙工以太網」WP條目指出,如果連接的一端使用自動協商,而另一端使用全雙工,則自動協商端將只檢測半雙工,導致大量碰撞。 – Philip 2011-04-12 22:20:12

+0

@DuneCat:在你的問題中應該說明uClinix,使它更清晰,並吸引對你的問題有了解uClinix知識的人...... – t0mm13b 2011-04-12 22:20:53