![](/img/trans.png)
[英]How can i send files asynchronously in a client-server application?(using winsock2.h, in 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.