2015-04-01 127 views
1

我創建了從客戶端發送一個文本文件到服務器 的應用到目前爲止,我是把它作爲字符串是這樣的:使用winsock將文件分解爲塊並將其作爲二進制從客戶端發送到服務器?

fp = fopen(filename, "r"); 
    if (fp != NULL) { 
     newLen = fread(source, sizeof(char), 5000, fp); 
      if (newLen == 0) { 
       fputs("Error reading file", stderr); 
      } else { 
    source[++newLen] = '\0'; /* Just to be safe. */ 
      } 
    }else{ 
     printf("The file %s does not exist :("); 
     return 1; 
    } 


    fclose(fp); 

    send(s , source , strlen(source) , 0); //send file 

但是我的教授告訴我,我必須將文件中的二進制和準備接受任何大小的文件 我想弄清楚如何以二進制文件發送文件並將其分割成大塊

+0

問題是? – alk 2015-04-01 15:53:56

+0

如果'source'是5000'char' long,那麼這個'source [newLen] ='\ 0''寫入數組的末尾。 – alk 2015-04-01 15:54:49

+1

你應該閱讀man strlen()。這很糟糕也不需要,因爲您已經知道有多少有效字節已被讀入緩衝區。 – 2015-04-01 17:22:10

回答

1

您可以一次複製一個字節。

一次讀取/寫入多於一個字節理論上會使它更高效地讀寫磁盤。但是由於二進制文件可能很短,而且磁盤I/O已經在內部進行了緩衝,所以它可能沒有明顯的區別。

perror()是一個方便的函數,它顯示與從最近的UNIX系統調用返回的錯誤代碼相關的文本。引號中的文本是在向您顯示與代碼關聯的系統消息之前顯示的標題。

exit(EXIT_FAILURE)以-1值退出,這是腳本可以測試以查看程序是成功還是失敗,因爲可以爲UNIX程序檢索退出狀態。

size_t是一個整數類型,但它被命名爲size_t來提示您使用的是什麼。

如果您想一次傳輸更多數據,您可以。但1字節的xfer很簡單,安全,並且工作。

FILE *exein, *exeout; 

exein = fopen("filein.exe", "rb"); 
if (exein == NULL) { 
    /* handle error */ 
    perror("file open for reading"); 
    exit(EXIT_FAILURE); 
} 
exeout = fopen("fileout.exe", "wb"); 
if (exeout == NULL) { 
    /* handle error */ 
    perror("file open for writing"); 
    exit(EXIT_FAILURE); 
} 
size_t n, m; 
unsigned char buff[8192]; 
do { 
    n = fread(buff, 1, sizeof buff, exein); 
    if (n) 
     m = fwrite(buff, 1, n, exeout); 
    else 
     m = 0; 
} while ((n > 0) && (n == m)); 
if (m) 
    perror("copy"); 
+0

你能解釋一下嗎? – user25633 2015-04-01 15:48:28

+0

這與您已經擁有和了解的內容非常相似。你想要澄清什麼部分?我更新了頂部的文本以解釋爲什麼我使用1字節的xfer。通過1個字節讀取 – clearlight 2015-04-01 15:49:31

+2

使得巨大的差異。問題不在於緩存,而在於從進程到系統的上下文切換以及每個字節的切換。 – 2015-04-01 15:53:50

相關問題