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


       过程如下:

 

 

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

 

        吃饭去咯。

 

 


本文转载:CSDN博客