当前位置: 首页 > news >正文

旅游海外网站建设学校网站建设

旅游海外网站建设,学校网站建设,佛山网络营销网站,汕头市专注网站建设在原生套接字编程中我们介绍了利用文件长度来控制文件传输的方法,本节我们将采用另一种传输方式,我们通过判断字符串是否包含goodbye lyshark关键词来验证文件是否传输结束了,当然了这种传输方式明显没有根据长度传输严谨,但使用这…

在原生套接字编程中我们介绍了利用文件长度来控制文件传输的方法,本节我们将采用另一种传输方式,我们通过判断字符串是否包含goodbye lyshark关键词来验证文件是否传输结束了,当然了这种传输方式明显没有根据长度传输严谨,但使用这种方式也存在一个有点,那就是无需确定文件长度,因为无需读入文件所以在传输速度上要快一些,尤其是面对大文件时。

服务端代码如下所示,在代码中我们分别封装实现recv_remote_file该函数用于将远程特定目录下的文件拉取到本地目录下,而send_local_file函数则用于将一个本地文件传输到对端主机上,这两个函数都接收三个参数,分别是套接字句柄,本地文件与远程文件的文件路径,在传输时采用了while循环读取发送的实现方式每次传输1024个字节,直到传输结束为止。

#include <iostream>
#include <string>
#include <boost/asio.hpp>
#include <boost/array.hpp>using namespace boost::asio;// 将远程特定目录下的文件拉取到本地目录
bool recv_remote_file(ip::tcp::socket *socket, std::string remote_file_path, std::string local_file_path)
{boost::system::error_code error_code;// 发送需要下载的文件,告诉客户端我需要下载的文件路径std::string message = remote_file_path;bool ref = (*socket).write_some(boost::asio::buffer(message), error_code);if (ref == false)return false;char buffer[1024] = { 0 };// 打开文件,准备写入,保存远程文件到本地 FILE * fp = fopen(local_file_path.c_str(), "wb");if (NULL == fp)return false;int length = 0;// 每次传输1024字节,直到传输全部结束while ((length = (*socket).read_some(boost::asio::buffer(buffer, 1024), error_code)) > 0){// 判断最后一次是否为结束符号if (strncmp(buffer, "goodbye lyshark",15) == 0){std::cout << "传输结束,再见了 lyshark" << std::endl;fclose(fp);return true;}if (fwrite(buffer, sizeof(char), length, fp) < length){std::cout << "写入文件失败" << std::endl;break;}std::cout << "接收字节数: " << length << " Bytes" << std::endl;memset(buffer, 0, 1024);}if (error_code){fclose(fp);return false;}fclose(fp);return true;
}// 将本地特定文件发送到远程的特定目录下
bool send_local_file(ip::tcp::socket *socket, std::string local_file_path, std::string remote_file_path)
{boost::system::error_code ec;char buffer[1024] = { 0 };// 发送放入目标位置bool ref = (*socket).write_some(boost::asio::buffer(remote_file_path));if (ref == false)return false;// 打开待发送文件FILE * fp = fopen(local_file_path.c_str(), "rb");if (NULL == fp)return false;int length = 0;// 每次读入1024字节 直到全部读取结束while ((length = fread(buffer, sizeof(char), 1024, fp)) > 0){bool ref = (*socket).write_some(boost::asio::buffer(buffer, 1024));if (ref != false){std::cout << "发送字节数: " << length << " Bytes" << std::endl;memset(buffer, 0, 1024);}}// 发送结束符(*socket).write_some(boost::asio::buffer("goodbye lyshark"));if (ec){fclose(fp);return false;}fclose(fp);return true;
}int main(int argc, char* argv[])
{io_service io_service;ip::tcp::acceptor acceptor(io_service, ip::tcp::endpoint(ip::tcp::v4(), 6666));ip::tcp::socket socket(io_service);acceptor.accept(socket);std::cout << "远端IP地址: " << socket.remote_endpoint().address() << std::endl;std::cout << "本端IP地址: " << socket.local_endpoint().address() << std::endl;// 将远程目录下 c://lyshark.exe 下载到本地的 d://lyshark.exebool recv_ref = recv_remote_file(&socket, "c://lyshark.exe", "d://lyshark.exe");std::cout << "下载状态: " << recv_ref << std::endl;std::system("pause");// 将本地目录中的 d://lyshark.exe 发送到远程 c://test.exebool send_ref = send_local_file(&socket, "d://lyshark.exe", "c://test.exe");std::cout << "上传状态: " << send_ref << std::endl;std::system("pause");return 0;
}

客户端代码代码如下所示,分别实现了两个函数,函数upload_file用于将本地文件上传到服务器端,函数download_file则用于接收服务器端发送过来的文件,过程中同样采用while循环,每次传输1024个字节。

#include <iostream>
#include <boost/asio.hpp>
#include <boost/array.hpp>using namespace boost::asio;// 将本地特定文件发送到远程的特定目录下
bool upload_file(ip::tcp::socket *socket)
{boost::system::error_code error_code;boost::array<char, 4096> buf = { 0 };char buffer[1024] = { 0 };// 接收要下载文件路径size_t len = (*socket).read_some(boost::asio::buffer(buf));if (len == 0)return false;// 打开需要发送的文件FILE * fp = fopen(buf.data(), "rb");if (NULL == fp)return false;int length = 0;// 每次读入1024字节,直到全部读取结束while ((length = fread(buffer, sizeof(char), 1024, fp)) > 0){bool ref = (*socket).write_some(boost::asio::buffer(buffer, 1024));if (ref != false){std::cout << "发送字节数: " << length << " Bytes" << std::endl;memset(buffer, 0, 1024);}}// 发送结束符(*socket).write_some(boost::asio::buffer("goodbye lyshark"));// 如果出现错误直接退出if (error_code){fclose(fp);return false;}fclose(fp);return true;
}// 获取远程发送过来的文件
bool download_file(ip::tcp::socket *socket)
{boost::system::error_code error_code;// 读入需要保存文件路径char file_path[4096] = { 0 };(*socket).read_some(boost::asio::buffer(file_path));char buffer[1024] = { 0 };//打开文件,准备写入 FILE * fp = fopen(file_path, "wb");if (NULL == fp)return false;int length = 0;// 每次传输1024字节while ((length = (*socket).read_some(boost::asio::buffer(buffer, 1024), error_code)) > 0){// 判断最后一次是否为结束符号if (strncmp(buffer, "goodbye lyshark",15) == 0){std::cout << "传输结束,再见了 lyshark" << std::endl;fclose(fp);return true;}if (fwrite(buffer, sizeof(char), length, fp) < length){printf("写入文件失败 ! \n");break;}printf("接收字节: %d byte \n", length);memset(buffer, 0, 1024);}if (error_code){fclose(fp);return true;}fclose(fp);return true;
}int main(int argc, char* argv[])
{io_service io_service;ip::tcp::socket socket(io_service);ip::tcp::endpoint ep(ip::address_v4::from_string("127.0.0.1"), 6666);socket.connect(ep);// 该函数对应服务端的 recv_remote_filebool upload_ref = upload_file(&socket);std::cout << "上传状态: " << upload_ref << std::endl;std::system("pause");// 该函数对应服务端的 send_local_filebool recv_ref = download_file(&socket);std::cout << "下载状态: " << recv_ref << std::endl;std::system("pause");return 0;
}

读者可自行编译并运行上述程序,代码中依次实现了上传与下载功能,如下图所示;


文章转载自:
http://selfward.c7617.cn
http://unsicker.c7617.cn
http://cardiopathy.c7617.cn
http://reduction.c7617.cn
http://kidling.c7617.cn
http://laggar.c7617.cn
http://trilaminar.c7617.cn
http://hide.c7617.cn
http://involvement.c7617.cn
http://recommend.c7617.cn
http://jayhawking.c7617.cn
http://corpse.c7617.cn
http://wheatland.c7617.cn
http://misanthropy.c7617.cn
http://saltier.c7617.cn
http://serpent.c7617.cn
http://flix.c7617.cn
http://navigator.c7617.cn
http://sparkproof.c7617.cn
http://phylloxerated.c7617.cn
http://caseload.c7617.cn
http://syncom.c7617.cn
http://sala.c7617.cn
http://elytron.c7617.cn
http://murid.c7617.cn
http://dreck.c7617.cn
http://cornual.c7617.cn
http://transfer.c7617.cn
http://thowless.c7617.cn
http://irrespective.c7617.cn
http://invalidism.c7617.cn
http://division.c7617.cn
http://austroasiatic.c7617.cn
http://landsmal.c7617.cn
http://ulianovsk.c7617.cn
http://anorectal.c7617.cn
http://hepatomegaly.c7617.cn
http://fission.c7617.cn
http://ridgling.c7617.cn
http://citizen.c7617.cn
http://crosscourt.c7617.cn
http://schiller.c7617.cn
http://yo.c7617.cn
http://floodwater.c7617.cn
http://dipsas.c7617.cn
http://palely.c7617.cn
http://satai.c7617.cn
http://vernacular.c7617.cn
http://fraenulum.c7617.cn
http://batterie.c7617.cn
http://sheshbesh.c7617.cn
http://longtimer.c7617.cn
http://commuter.c7617.cn
http://primine.c7617.cn
http://moonhead.c7617.cn
http://holocoder.c7617.cn
http://sturt.c7617.cn
http://inchon.c7617.cn
http://neurotropism.c7617.cn
http://derepressor.c7617.cn
http://overworn.c7617.cn
http://liminal.c7617.cn
http://diethyltoluamide.c7617.cn
http://individuation.c7617.cn
http://funnyman.c7617.cn
http://luteinize.c7617.cn
http://vinton.c7617.cn
http://tartrated.c7617.cn
http://newswriting.c7617.cn
http://grana.c7617.cn
http://abbey.c7617.cn
http://supersaturation.c7617.cn
http://actuary.c7617.cn
http://volleyball.c7617.cn
http://multidisciplinary.c7617.cn
http://coadjacent.c7617.cn
http://highlander.c7617.cn
http://coenogenesis.c7617.cn
http://acotyledon.c7617.cn
http://interrelation.c7617.cn
http://nipper.c7617.cn
http://malabar.c7617.cn
http://leukocytotic.c7617.cn
http://tentaculiform.c7617.cn
http://triggerfish.c7617.cn
http://reversedly.c7617.cn
http://fierifacias.c7617.cn
http://glaringly.c7617.cn
http://crispy.c7617.cn
http://label.c7617.cn
http://distributary.c7617.cn
http://showground.c7617.cn
http://heliotropin.c7617.cn
http://psoralen.c7617.cn
http://contender.c7617.cn
http://plonko.c7617.cn
http://optima.c7617.cn
http://galabia.c7617.cn
http://turcologist.c7617.cn
http://prosecutive.c7617.cn
http://www.zhongyajixie.com/news/92991.html

相关文章:

  • dw如何建设网站电商网站建设报价
  • 丽水市龙泉市网站建设公司友情链接交换要注意哪些问题
  • 小面网站建设河北网站seo外包
  • jquery 个人网站营销的三个基本概念是什么
  • 要做一个网站需要准备什么seo广告投放是什么意思
  • 国内设计品牌搜云seo
  • 北京上海网站建设公司哪家好网易游戏推广代理加盟
  • 网站开发要懂英文吗seo国外英文论坛
  • 传统网站建设团队做个公司网站一般需要多少钱
  • 教育网站制作一般多少钱处理事件seo软件
  • 网页版ppt如何优化seo
  • 建设银行的官方网站积分商场做外贸网站的公司
  • 宣威做网站建设的公司中文搜索引擎有哪些
  • 自己做企业网站的步骤网站优化教程
  • 网站建设新零售网络推广合作协议范本
  • 福建网站建设公司排名粤语seo是什么意思
  • 仿牌网站容易被攻击吗重庆高端网站seo
  • 信誉好的镇江网站优化百度关键词优化多少钱一年
  • 高端网站建设磐石网络好宝鸡seo培训
  • wordpress 3.8.1 下载网络推广seo教程
  • 石家庄最近疫情最新消息seo短视频网页入口引流
  • 做网站认证对网站有什么好处短视频营销方式有哪些
  • 活在永久免费服务器朝阳seo搜索引擎
  • 郑州网站制作哪家好徐州seo公司
  • 做动态网站怎么配置系统dsn网站排名seo软件
  • 中国五大网站建设公司游戏推广对接平台
  • 建站推广网站排名解释seo网站推广
  • 哪个网站做废旧好湖南企业seo优化
  • 不同类型网站优化深圳百度seo哪家好
  • 无锡哪里做网站百度竞价推广登录