簡體   English   中英

使用Winsock將文件分解成塊,然后以二進制形式從客戶端發送到C中的服務器嗎?

[英]Break a file into chunks and send it as binary from client to server in C using 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

但是我的教授告訴我,我必須以二進制格式發送文件,並准備接受任何大小的文件,我試圖弄清楚如何以二進制格式發送文件並將其分成大塊

您可以一次復制一個字節。

理論上說 ,一次讀取/寫入一個字節以上將使它對磁盤的讀取和寫入效率更高。 但是由於二進制文件可能很短,並且磁盤I / O已經在內部進行了緩沖,因此可能不會產生明顯的變化。

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

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

size_t是整數類型,但是它被命名為size_t來提示您使用它的目的。

如果您想一次傳輸更多數據,則可以。 但是1字節xfers簡單安全,並且可以正常工作。

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");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM