使用TCP协议实现文件传输。程序会分为服务器端和客户端,首先运行服务器端,监听来自客户端的连接,客户端运行后会通过程序内的服务器端IP地址,向服务器发送连接请求。双方建立请求之后,客户端将所需文件的文件名和绝对路径传输给服务器,如果服务器找到此文件,则将此文件传输给客户端,然后断开连接。
具体算法描述如下:
【1】服务器端:
1、初始化socket服务
2、监听连接请求并做相应的处理
2.1创建监听套接字
2.2监听套接口
2.3接受套接字的连接
2.4接收客户端传来的数据
case 文件绝对路径:
按照路径找到文件,并打开。提取本地文件名,发回给客户端
发送文件总长度给客户端
case 已准备接收文件完毕
if 发送缓冲区为空
读取文件,写入缓冲区
将文件流分成大小相同的组(最后一组可能会小一点),顺次发送给客户端
将缓冲区清空
case 文件成功传送
打印消息,退出
case 文件已存在
打印消息,退出
2.5关闭同客户端的连接
3、释放socket服务
【2】客户端:
1、初始化socket,winsock服务
2、连接服务器,进行数据的传输
2.1初始化,创建套接字
2.2通过IP地址,向服务器发送连接请求,建立连接
2.3主动发送所求文件绝对路径
2.4接受服务器端数据并做相应处理
case 打开文件错误:
重新发送文件绝对路径至服务器,请求重发
case 文件长度:
打印消息
case 文件名:
if 文件已经存在
发送“文件已经存在”
else
分配缓冲区,并向服务器发送“Ready”消息
case 文件流:
为已接收文件名创建文件
打开文件,将文件流数据写入文件,直至接收所有分组数据
发送“成功接收“消息
3、关闭套接字
释放服务
源程序:
【1】服务器端:
头文件:
/*server.h*/
#pragma comment(lib, "WS2_32")
#include <WinSock2.h>
#include <iostream>
#include <assert.h>
#include<Windows.h>
#ifndef COMMONDEF_H
#define COMMONDEF_H
#define MAX_PACKET_SIZE 10240 // 数据包的最大长度,单位是sizeof(char)
#define MAXFILEDIRLENGTH 256 // 存放文件路径的最大长度
#define PORT 4096 // 端口号
//#define SERVER_IP "127.0.0.1" // server端的IP地址
// 各种消息的宏定义
#define INVALI