博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
An extremely simple ftp-like ftp
阅读量:4140 次
发布时间:2019-05-25

本文共 2818 字,大约阅读时间需要 9 分钟。

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

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

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

 

       ftp-like server 先启动:

 

#include 
#include
#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 
#include
#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;}

       过程如下:

 

 

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

 

        吃饭去咯。

 

 

你可能感兴趣的文章
JAVA操作properties文件的代码实例
查看>>
IPS开发手记【一】
查看>>
Java通用字符处理类
查看>>
文件上传时生成“日期+随机数”式文件名前缀的Java代码
查看>>
Java代码检查工具Checkstyle常见输出结果
查看>>
北京十大情人分手圣地
查看>>
Android自动关机代码
查看>>
Android中启动其他Activity并返回结果
查看>>
2009年33所高校被暂停或被限制招生
查看>>
GlassFish 部署及应用入门
查看>>
iWatch报错: Authorization request cancled
查看>>
iWatch报错: Authorizationsession time out
查看>>
X-code7 beta error: warning: Is a directory
查看>>
Error: An App ID with identifier "*****" is not avaliable. Please enter a different string.
查看>>
iTunes Connect 上传APP报错: Communication error. please use diagnostic mode to check connectivity.
查看>>
3.5 YOLO9000: Better,Faster,Stronger(YOLO9000:更好,更快,更强)
查看>>
iOS菜鸟学习--如何避免两个按钮同时响应
查看>>
How to access the keys in dictionary in object-c
查看>>
iOS菜鸟学习—— NSSortDescriptor的使用
查看>>
hdu 3787 hdoj 3787
查看>>