2013-10-03 84 views
0

我在c中創建套接字程序。它將文件中的數據分成多個塊並通過套接字發送。目的地的數據以亂序方式到達。我如何管理這個。由於文件很大,我無法將所有數據保存在內存中。套接字編程c - 文件下載

+0

大概你正在使用多個套接字,每個大塊一個? – Duck

+2

使用TCP不是UDP。如果你已經在使用TCP,你有一個普通的bug。 – ddyer

+0

我正在使用TCP連接。是的...多個套接字從不同位置下載文件。所以他們必然會失序。無法弄清楚如何將數據保存在磁盤上,並最終按順序組合所有塊。 –

回答

0

提前創建一個稀疏文件,並在您進行時填寫它。你沒有指定什麼操作系統,但在這裏是一個如何在Linux中執行它的示例程序。

#define _BSD_SOURCE 

#include <unistd.h> 
#include <sys/types.h> 
#include <stdio.h> 
#include <fcntl.h> 

int main(int argc, const char *argv[]) 
{ 
    int fd = open(argv[1], O_WRONLY | O_CREAT | O_TRUNC, 0666); 

    if (fd < 0) 
    { 
     perror("open"); 
     return(1); 
    } 

    int offset = lseek(fd, 200000, SEEK_CUR); 

    ftruncate(fd, offset); 

    close(fd); 

    return 0; 
} 

大概你有某種方案,你知道哪個塊(即偏移量)進入每個套接字。用它來計算文件中的正確偏移並寫入它們。

3

我對這種情況下的標準方法不熟悉,但是afaik tcp是有序的。如果你堅持使用udp,你總是可以在每個塊上預先設置一個1字節(或更少)的塊來指定排序,然後使用它對客戶端進行排序。

+0

我正在使用TCP連接。是的...多個套接字從不同位置下載文件。所以他們必然會失序。無法弄清楚如何將數據保存在磁盤上,並最終按順序組合所有塊。 –

+0

例如從多個服務器下載單個文件?將塊的偏移量編碼爲第一個字或字節。然後你就知道該塊屬於哪個文件。如果你是客戶端,並且無法訪問服務器,那麼你可能會失敗。如果服務器不告訴你你得到了什麼,那麼你不能訂購你的數據。 –