An extremely simple ftp-like ftp

来源:互联网 发布:阿里云注册 编辑:程序博客网 时间:2024/05/17 06:39

        做程序员的老伴是幸福的, 当然经常加班的程序员的老伴就有点郁闷了, 有时。 今天有事请假一天, 休息一下, 也算难得, 写了个极其简单的ftp-like ftp

        程序员的老伴一般不是程序员, 程序员经常为老伴写写小程序, 实现一些她需要的功能, 那无疑是莫大的快乐, 有利于家庭和睦。 我把这个软件献给我的老伴。

        为了简便起见, 我在这里就不拿出自己的界面程序了, 仅仅写个console下的程序来简要模拟其中的功能。 另外为了简便示意, 我不考虑程序的异常分支。


       ftp-like server 先启动:

#include <stdio.h>#include <winsock2.h>#pragma comment(lib, "ws2_32.lib")int main(){// tcp连接部分WORD wVersionRequested;WSADATA wsaData;wVersionRequested = MAKEWORD(1, 1);WSAStartup( wVersionRequested, &wsaData );unsigned int sockSrv = socket(AF_INET, SOCK_STREAM, 0);SOCKADDR_IN addrSrv;addrSrv.sin_family = AF_INET; addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); addrSrv.sin_port = htons(8888); bind(sockSrv,(SOCKADDR*)&addrSrv, sizeof(SOCKADDR));listen(sockSrv, 5);SOCKADDR_IN addrClient;int len = sizeof(SOCKADDR);unsigned int sockConn = accept(sockSrv,(SOCKADDR*)&addrClient, &len);// 接收ftp-like client发送过来的文件长度 char sizeFileStr[20] = {0};recv(sockConn, sizeFileStr, sizeof(sizeFileStr) - 1, 0);int fileSize = atoi(sizeFileStr);// 接收ftp-like client发送的文件并保存char recvBuf[1024] = {0};  int recvTotalSize = 0;FILE *fp = fopen("server.rar", "wb");while(recvTotalSize < fileSize){int recvSize = recv(sockConn, recvBuf, sizeof(recvBuf), 0);recvTotalSize += recvSize;printf("received %f MB\n", recvTotalSize/(1024.0 * 1024.0));fwrite(recvBuf, 1, recvSize, fp);}fclose(fp);if(recvTotalSize == fileSize){printf("Done!");}else{printf("Error!");}closesocket(sockSrv);WSACleanup();getchar();return 0;}

       然后启动ftp-like client:

#include <stdio.h>#include <winsock2.h>#pragma comment(lib, "ws2_32.lib")int main(){// tcp连接部分WORD wVersionRequested;WSADATA wsaData;wVersionRequested = MAKEWORD(1, 1);WSAStartup( wVersionRequested, &wsaData );SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");addrSrv.sin_family = AF_INET;addrSrv.sin_port = htons(8888);connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));// ftp-like client读取文件长度FILE *fp = fopen("MVC++6.0.rar", "rb");    fseek( fp, 0, SEEK_END );    int totalSize =  ftell(fp);fclose(fp);// ftp-like client发送文件长度char fileSizeStr[20] = {0};itoa(totalSize, fileSizeStr, 10);send(sockClient, fileSizeStr, strlen(fileSizeStr) + 1, 0);// ftp-like client发送文件fp = fopen("MVC++6.0.rar", "rb");int  readSize = 0;int  sendTotalSize = 0;char sendBuf[1024] = {0};while((readSize = fread(sendBuf, 1, sizeof(sendBuf), fp)) > 0){send(sockClient, sendBuf, readSize, 0); sendTotalSize += readSize;printf("sent %f MB\n", sendTotalSize/(1024.0 * 1024.0));}fclose(fp);if(sendTotalSize == totalSize){printf("Done!");}else{printf("Error!");}closesocket(sockClient);WSACleanup();getchar();return 0;}

       过程如下:



        结果:利用哈希计算软件, 计算了一下两个文件的哈希值, 发现完全一致, 由此可见: 文件传送是成功的。


        吃饭去咯。



0 0
原创粉丝点击