本文共 2818 字,大约阅读时间需要 9 分钟。
做程序员的老伴是幸福的, 当然经常加班的程序员的老伴就有点郁闷了, 有时。 今天有事请假一天, 休息一下, 也算难得, 写了个极其简单的ftp-like ftp
程序员的老伴一般不是程序员, 程序员经常为老伴写写小程序, 实现一些她需要的功能, 那无疑是莫大的快乐, 有利于家庭和睦。 我把这个软件献给我的老伴。
为了简便起见, 我在这里就不拿出自己的界面程序了, 仅仅写个console下的程序来简要模拟其中的功能。 另外为了简便示意, 我不考虑程序的异常分支。
ftp-like server 先启动:
#include然后启动ftp-like client:#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;}
#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;}
结果:利用哈希计算软件, 计算了一下两个文件的哈希值, 发现完全一致, 由此可见: 文件传送是成功的。
吃饭去咯。