c++ socket学习(1.5)

本文学习相关资料:
C/C++ socket编程教程

环境:vs2015
源码:本文代码

这次来试一下使用TCP来传输文件,其实传输数据和差不多,就是多一个读取文件,和一个写文件而已。

服务端

int readlan = 100;
std::ifstream infile;

SOCKET client = accept(servSock, (sockaddr*)&clntAddr, &nSize);

	//获取
do {
	//接收获取的文件名
	recv(client, buf, maxlen, 0);
	std::cout << buf << std::endl;
	//打开文件
	infile.open(buf, std::ios::binary | std::ios::in);
	if (infile.is_open()) { //如果打开文件成功就退出,否则继续等待
		break;
	}
	else {
		std::cout << "文件打开失败" << std::endl;
		send(client, "False", 6, 0);
	}
} while (1);

if (infile.is_open()) {
//打开文件成功,通知客户端接收文件
	send(client, "True", 5, 0);
	std::cout << "准备发送文件" << std::endl;
	int num = 0;
	//获取文件的大小
	infile.seekg(0, std::ios::end);
	int length = infile.tellg();

		//设置文件指针在第一个位置
		infile.seekg(std::ios::beg);
		//循环读取
		while (length > 0) {
		std::cout << "正在发送文件,目前还剩余" << length << "字节" << std::endl;
		memset(&buf, maxlen, 0);
		//读取内容,每次读readlen个字节
		if (length >= readlen) { 
			length -= readlen;
			infile.read(buf, readlen);
			num = readlen;
		}
		else {
			num = length;
			infile.read(buf, length);
			length = 0;
		}
		//发送内容
		send(client, buf, num, 0);
	}
}
else {
	std::cout << "文件打开失败,即将关闭" << std::endl;
}
//发送断开连接信息
shutdown(client, SD_SEND);
//关闭文件和套接字
infile.close();
closesocket(client);

客户端

std::ofstream f;
std::string fileName;

//连接到服务端
connect(client, (sockaddr*)&servAddr, sizeof(sockaddr));
while (1) {
	memset(buf, maxlen, 0);
	std::cout << "请输入要下载的文件名称:";
	//输入文件名称
	std::cin >> fileName;
	send(client, fileName.c_str(), fileName.size() + 1, 0);
	recv(client, buf, readlen, 0);
	if (strcmp(buf, "True") == 0) {
		break;
	}
}
//打开文件
f.open(fileName.c_str(), std::ios::binary | std::ios::out);
while (1) {
	int nlen = recv(client, buf, readlen, 0);
	if (nlen <= 0) {
		std::cout << "文件接收完毕!" << std::endl;
		break;
	}
	else {
		//写入文件
		f.write(buf, nlen); 
		f.flush();
	}
}
f.close();
closesocket(client);

可能会注意到这里服务端能接收到连接,是因为调用了listen,但是客户端没有listen,服务端是怎么知道要把数据发送到哪里呢?

原来服务端在调用accept的时候,就已经获取到了客户端的IP地址端口号,保存在了clntAddr

那么客户端又没有bind 又怎么来IP地址端口呢?

简单地来说是当客户端调用connect的时候,系统自动分配的,毕竟需要个IP地址端口才能进行3次握手

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值