怎么用ftp修改网站,网站托管费,视频制作软件教程,做的好看的统一登录网站本文学习相关资料#xff1a; C/C socket编程教程
环境#xff1a;vs2015 源码#xff1a;本文代码
这次来试一下使用TCP来传输文件#xff0c;其实传输数据和差不多#xff0c;就是多一个读取文件#xff0c;和一个写文件而已。
服务端
int readlan 100;
std::ifst…本文学习相关资料 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次握手。