閒暇時寫的一個基於SOCKET的文件傳輸程序

来源:互联网 发布:php 分割二维数组 编辑:程序博客网 时间:2024/04/26 05:13
//Server----Receive#include <cstdlib> #include <iostream> #include "CSocket.h" #define SIZE (1024*1024) struct pack_head {       int nfileSize;     char szfileName[32];     }; int main(int argc, char *argv[]) {     CSocket::InitLib();     CSocket sock, trsock;     sock.InitSock();     sock.Bind();     sock.Listen();     Redo:          printf("Now wait for connection........\n");     sock.Accept(trsock);     printf("Connected now........\n");         pack_head strupk;     memset(&strupk, 0, sizeof(pack_head));     trsock.Recv((char*)&strupk, sizeof(pack_head));     printf("%s\n%d\n", strupk.szfileName, strupk.nfileSize);     assert(strupk.nfileSize > 0);     char path[32] = "E:\\"; strcat(path, strupk.szfileName);         FILE *fp = fopen(path, "wb");     assert(fp != NULL);         int FileSize = strupk.nfileSize;     int nXiabiao = 0;     int nBytesRecvd = 0;    char *pBuff = (char*)malloc(SIZE);     memset(pBuff, 0, SIZE);         printf("Receiving...................................");        while (nBytesRecvd < FileSize)     {          int k = trsock.Recv(pBuff+nXiabiao, SIZE);                   if (k <= 0)          {               trsock.Close();              fclose(fp);              goto Redo;         }                   nXiabiao += k;          nBytesRecvd += k;                  int i = int(((double)nBytesRecvd/FileSize)*100);         printf("%d%%", i);         if (i <= 9)              printf("\b\b");         else if (i != 100)              printf("\b\b\b");         else              printf("\n");                             if (nXiabiao == SIZE || nBytesRecvd == FileSize)          {               fflush(fp);              fwrite(pBuff, 1, nXiabiao, fp);                 memset(pBuff, 0, SIZE);               nXiabiao = 0;                        }     }           fclose(fp);    free(pBuff);    system("PAUSE");     return EXIT_SUCCESS; }//Client------Send  #include <cstdlib>  #include <iostream>  #include "CSocket.h"  #define SIZE (1024*1024)     struct pack_head   {         int nfileSize;       char szfileName[32];       };          int main(int argc, char *argv[])  {      CSocket::InitLib();      CSocket c;      c.InitSock();            while (c.Connect() == FALSE)      {          Sleep(1000*2);;                  }            printf("Connected !\n");            char fpath[128] = "";      char fname[20] = "";        printf("Input file path:");            gets(fpath);      printf("Input file name:");      gets(fname);            FILE* fp = fopen(fpath, "rb");         assert(fp != NULL);               fseek(fp, 0, SEEK_END);      int filesize = ftell(fp);      fseek(fp, 0, SEEK_SET);            printf("filesize:\t%d\n", filesize);            pack_head s;       memset(&s, 0, sizeof(pack_head));      memcpy(s.szfileName, fname, sizeof(fname));      s.nfileSize = filesize;            c.Send((char*)&s, sizeof(s));       char *pBuff = (char*)malloc(SIZE);       memset(pBuff, 0, SIZE);       int nBytesSend = 0;      printf("Sending...................................");            while(!feof(fp))      {                            int read = fread(pBuff, 1, SIZE, fp);            {               int k = c.Send(pBuff, read);               if (k <= 0)               {                   c.Close();                   fclose(fp);                   break;               }                else               {                       nBytesSend += k;                    int i = int(((double)nBytesSend/filesize)*100);                   printf("%d%%", i);                   if (i <= 9)                       printf("\b\b");                   else if (i != 100)                       printf("\b\b\b");                   else                       printf("\n");               }                                              }           memset(pBuff, 0, SIZE);           Sleep(10);                }                  fclose(fp);      free(pBuff);      system("PAUSE");      return EXIT_SUCCESS;  }