做程序员的老伴是幸福的, 当然经常加班的程序员的老伴就有点郁闷了, 有时。 今天有事请假一天, 休息一下, 也算难得, 写了个极其简单的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;
}
过程如下:
结果:利用哈希计算软件, 计算了一下两个文件的哈希值, 发现完全一致, 由此可见: 文件传送是成功的。
吃饭去咯。