网站集约化建设的通知中卫网红大型蹦床设备

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

网站集约化建设的通知,中卫网红大型蹦床设备,淄博网站制作定制,郑州做营销型网站的公司在原生套接字编程中我们介绍了利用文件长度来控制文件传输的方法#xff0c;本节我们将采用另一种传输方式#xff0c;我们通过判断字符串是否包含goodbye lyshark关键词来验证文件是否传输结束了#xff0c;当然了这种传输方式明显没有根据长度传输严谨#xff0c;但使用这…在原生套接字编程中我们介绍了利用文件长度来控制文件传输的方法本节我们将采用另一种传输方式我们通过判断字符串是否包含goodbye lyshark关键词来验证文件是否传输结束了当然了这种传输方式明显没有根据长度传输严谨但使用这种方式也存在一个有点那就是无需确定文件长度因为无需读入文件所以在传输速度上要快一些尤其是面对大文件时。 服务端代码如下所示在代码中我们分别封装实现recv_remote_file该函数用于将远程特定目录下的文件拉取到本地目录下而send_local_file函数则用于将一个本地文件传输到对端主机上这两个函数都接收三个参数分别是套接字句柄本地文件与远程文件的文件路径在传输时采用了while循环读取发送的实现方式每次传输1024个字节直到传输结束为止。 #include iostream #include string #include boost/asio.hpp #include boost/array.hppusing 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.hppusing namespace boost::asio;// 将本地特定文件发送到远程的特定目录下 bool upload_file(ip::tcp::socket *socket) {boost::system::error_code error_code;boost::arraychar, 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; }读者可自行编译并运行上述程序代码中依次实现了上传与下载功能如下图所示