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
- An extremely simple ftp-like ftp
- Simple Ftp server
- Simple C# FTP Class
- A simple FTP update client
- simple auto backup ftp script
- FTP
- ftp
- ftp
- ftp
- ftp
- ftp
- FTP
- FTP
- ftp
- ftp
- ftp
- FTP
- FTP
- xcode6-beta5版本下载链接!
- 我的第一个博客
- FTP相关网络协议
- java对象复制
- Opencv2.4.4+VS2010永久配置
- An extremely simple ftp-like ftp
- python 安装 easy_install 的三种方式
- GCC 编译使用动态链接库和静态链接库
- 修改WEB工程的项目名
- ZOJ-1232 Adventure of Super Mario
- java-日期类学习
- JAVA Collection框架
- C# DataTable的常用用法讲解
- MQX----任务同步