[C/C++] Socket Programming: Upload/Download

  • 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

No comments:

Post a Comment

Orange - data analysis tool

Installation pip install orange3 Run orange python -m Orange.canvas