目标
(1)大文件的传输。对于比较大的文件,应该进行分包操作,以防止占用过多的内存,导致文件发送
失败,实验中每次最多传输1024个字符;
(2)用户根据参数输入选择传输的文件和传输位置;
(3)发送端和接收端分别显示文件传输相应的信息,包括:对方IP地址,当前已写(读)文件长度等;
(4)对于Ctrl+C命令以及服务器提前关闭的特殊情况给出响应(如:显示信息)
服务器代码
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#include <winsock2.h>
#include<iostream>
#include<string>
#include<fstream>
#include<sstream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma comment (lib, "ws2_32.lib") //加载 ws2_32.dll
#define BUF_SIZE 1024
//using namespace std; //直接用std好像会出现bug
using std::cout;
//封装套接字绑定
int make_socket(const char* address,int port)
{
//创建套接字
SOCKET Sock = socket(AF_INET, SOCK_STREAM, 0);
//绑定套接字
sockaddr_in sockAddr;
memset(&sockAddr, 0, sizeof(sockAddr)); //每个字节都用0填充
sockAddr.sin_family = AF_INET; //使用IPv4地址
sockAddr.sin_addr.s_addr = inet_addr(address); //回送IP地址
sockAddr.sin_port = htons(1234); //端口
bind(Sock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));
return Sock;
}
//通过套接字获取IP、Port等地址信息
bool GetAddressBySocket(SOCKET m_socket, SOCKADDR_IN &m_address)
{
memset(&m_address, 0, sizeof(m_address));
int nAddrLen = sizeof(m_addr