- Socket Programming: Upload/Download
Download:upload_download_unix.zip
繼上一篇[C/C++] Socket Connection我們將scoket connection延伸應用至檔案傳輸。流程圖如下:
這個範裡我只實做upload和download兩個功能,為了要處理Nagle's algorithm所帶來的影響,所以我的程式實做方式會有點不同。其中主要的程式片段是在檔案下上傳的部份,如下:
/*** Server.c in upload() ***/
/* Send file data to client */
do{
memset(buffer, '\0', BUFF_SIZE+1);
ret = fread(&buffer, sizeof(char), BUFF_SIZE, fp);
ret = send(socket, buffer, ret, 0);
if(ret == -1){
fprintf(stderr, "Fail to send message to client\n");
return 0;
}
}while((count += ret) < totalSize);
/*** Client.c in upload() ***/
/* Send file data to server */
do{
memset(buffer, '\0', BUFF_SIZE+1);
ret = fread(&buffer, sizeof(char), BUFF_SIZE, fp);
ret = send(socket, buffer, ret, 0);
if(ret == -1){
fprintf(stderr, "Fail to send message to server\n");
return 0;
}
usleep(1000);
fprintf(stderr, "\b\b\b\b\b\b\b%c%6.2f", 37, (double)((count+ret) * 100 / totalSize));
}while((count += ret) < totalSize);
ret為整數變數,用來承接所有接收到的大小,在這次的修正版裡全部的send(), recv()都以BUFF_SIZE為基礎,唯只有在檔案傳送的部份則是以fread()回傳數來決定。
由於在遠端傳輸過程中並不像近端網路下的理想對等,所以在接收過程中我以檔案的總大小(totalSize)與目前接收的量做為是否繼續接收資料的依據。
此版本是以Linux系統為基礎修正了一些之前沒有做的錯誤處理,並使用fork來作多人連線的功能,關於fork()的使用可以參考這一篇[C/C++] Process Programming - fork(),或者你也可以使用pthread來完成[C/C++] Multithreading Porgramming - pthread