閒暇時寫的一個基於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; }