文件传输服务器(43)

TCP、UDP文件传输分析 题目要求 为巩固提高网络编程能力,加深对socket套接字的使用,并进一步的理解UDP和TCP之间的不同,该题目主要需完成以下两个目标: 实现跨物理主机的文件传输系统。 分别使用TCP和UDP协议,利用socket库,完成一个文件传输程序。 文本文件能够跨物理主机在局域网内进行传输。 语言不限(python,java,C,C++,C#)。 分析文件传输的时延。 分... 阅读详情

文件传输(MuduoManual.pdf P57)
examples/filetransfer/download.cc
examples/filetransfer/download2.cc
examples/filetransfer/download3.cc

tests/Filetransfer_test.cc





单线程模式之一次性发完一个文件

#include <muduo/base/Logging.h>
#include <muduo/net/EventLoop.h>
#include <muduo/net/TcpServer.h>

#include <stdio.h>

using namespace muduo;
using namespace muduo::net;

const char* g_file = NULL;

// FIXME: use FileUtil::readFile()
string readFile(const char* filename)
{
  string content;
  FILE* fp = ::fopen(filename, "rb");
  if (fp)
  {
    // inefficient!!!
    const int kBufSize = 1024*1024;
    char iobuf[kBufSize];
    ::setbuffer(fp, iobuf, sizeof iobuf);

    char buf[kBufSize];
    size_t nread = 0;
    while ( (nread = ::fread(buf, 1, sizeof buf, fp)) > 0)
    {
      content.append(buf, nread);
    }
    ::fclose(fp);
  }
  return content;
}

void onHighWaterMark(const TcpConnectionPtr& conn, size_t len)
{
  LOG_INFO << "HighWaterMark " << len;
}

void onConnection(const TcpConnectionPtr& conn)
{
  LOG_INFO << "FileServer - " << conn->peerAddress().toIpPort() << " -> "
           << conn->localAddress().toIpPort() << " is "
           << (conn->connected() ? "UP" : "DOWN");
  if (conn->connected())
  {
    LOG_INFO << "FileServer - Sending file " << g_file
             << " to " << conn->peerAddress().toIpPort();
    conn->setHighWaterMarkCallback(onHighWaterMark, 64*1024);
    string fileContent = readFile(g_file);
    conn->send(fileContent);
    conn->shutdown();
    LOG_INFO << "FileServer - done";
  }
}

int main(int argc, char* argv[])
{
  LOG_INFO << "pid = " << getpid();
  if (argc > 1)
  {
    g_file = argv[1];

    EventLoop loop;
    InetAddress listenAddr(2021);
    TcpServer server(&loop, listenAddr, "FileServer");
    server.setConnectionCallback(onConnection);
    server.start();
    loop.loop();
  }
  else
  {
    fprintf(stderr, "Usage: %s file_for_downloading\n", argv[0]);
  }
}


单线程模型之分块发送文件

#include <muduo/base/Logging.h>
#include <muduo/net/EventLoop.h>
#include <muduo/net/TcpServer.h>

#include <stdio.h>

using namespace muduo;
using namespace muduo::net;

void onHighWaterMark(const TcpConnectionPtr& conn, size_t len)
{
  LOG_INFO << "HighWaterMark " << len;
}

const int kBufSize = 64*1024;
const char* g_file = NULL;

void onConnection(const TcpConnectionPtr& conn)
{
  LOG_INFO << "FileServer - " << conn->peerAddress().toIpPort() << " -> "
           << conn->localAddress().toIpPort() << " is "
           << (conn->connected() ? "UP" : "DOWN");
  if (conn->connected())
  {
    LOG_INFO << "FileServer - Sending file " << g_file
             << " to " << conn->peerAddress().toIpPort();
    /*高水位标志的回调函数*/
    conn->setHighWaterMarkCallback(onHighWaterMark, kBufSize+1);

    FILE* fp = ::fopen(g_file, "rb");
    if (fp)
    {
    /*设置conn 的上下文*/
      conn->setContext(fp);
      char buf[kBufSize];
      size_t nread = ::fread(buf, 1, sizeof buf, fp);
      conn->send(buf, nread);
    }
    /*发送完毕就shutdown connection*/
    else
    {
      conn->shutdown();
      LOG_INFO << "FileServer - no such file";
    }
  }
  /*如果连接关闭,那么就关闭文件指针*/
  else
  {
    if (!conn->getContext().empty())
    {
      FILE* fp = boost::any_cast<FILE*>(conn->getContext());
      if (fp)
      {
        ::fclose(fp);
      }
    }
  }
}

/*如果发完一块,还有其他块,那么接着发送,这只fp是保存在

connection的上下文中,所以是同一个文件指针*/
void onWriteComplete(const TcpConnectionPtr& conn)
{
  FILE* fp = boost::any_cast<FILE*>(conn->getContext());
  char buf[kBufSize];
  size_t nread = ::fread(buf, 1, sizeof buf, fp);
  if (nread > 0)
  {
    conn->send(buf, nread);
  }
  /*如果发完也关闭掉*/
  else
  {
    ::fclose(fp);
    fp = NULL;
    conn->setContext(fp);
    conn->shutdown();
    LOG_INFO << "FileServer - done";
  }
}

int main(int argc, char* argv[])
{
  LOG_INFO << "pid = " << getpid();
  if (argc > 1)
  {
    g_file = argv[1];

    EventLoop loop;
    InetAddress listenAddr(2021);
    TcpServer server(&loop, listenAddr, "FileServer");
    server.setConnectionCallback(onConnection);
    server.setWriteCompleteCallback(onWriteComplete);
    server.start();
    loop.loop();
  }
  else
  {
    fprintf(stderr, "Usage: %s file_for_downloading\n", argv[0]);
  }
}


单线程模型之分块发送(智能指针)

#include <muduo/base/Logging.h>
#include <muduo/net/EventLoop.h>
#include <muduo/net/TcpServer.h>

#include <boost/shared_ptr.hpp>

#include <stdio.h>

using namespace muduo;
using namespace muduo::net;
/*这个程序和第二个是一样,只是这里的文件指针是智能共享的,
不用我们手动关闭*/

void onHighWaterMark(const TcpConnectionPtr& conn, size_t len)
{
  LOG_INFO << "HighWaterMark " << len;
}

const int kBufSize = 64*1024;
const char* g_file = NULL;
typedef boost::shared_ptr<FILE> FilePtr;

void onConnection(const TcpConnectionPtr& conn)
{
  LOG_INFO << "FileServer - " << conn->peerAddress().toIpPort() << " -> "
           << conn->localAddress().toIpPort() << " is "
           << (conn->connected() ? "UP" : "DOWN");
  if (conn->connected())
  {
    LOG_INFO << "FileServer - Sending file " << g_file
             << " to " << conn->peerAddress().toIpPort();
    conn->setHighWaterMarkCallback(onHighWaterMark, kBufSize+1);

    FILE* fp = ::fopen(g_file, "rb");
    if (fp)
    {
    /*这里ctx接受两个参数,因为ctx不是类的指针,所以他不是调用delete
    来消费ctx指针,而是调用fclose这个函数来消费这个ctx指针*/
      FilePtr ctx(fp, ::fclose);
      conn->setContext(ctx);
      char buf[kBufSize];
      size_t nread = ::fread(buf, 1, sizeof buf, fp);
      conn->send(buf, nread);
    }
    else
    {
      conn->shutdown();
      LOG_INFO << "FileServer - no such file";
    }
  }
}

void onWriteComplete(const TcpConnectionPtr& conn)
{
  const FilePtr& fp = boost::any_cast<const FilePtr&>(conn->getContext());
  char buf[kBufSize];
  size_t nread = ::fread(buf, 1, sizeof buf, get_pointer(fp));
  if (nread > 0)
  {
    conn->send(buf, nread);
  }
  else
  {
    conn->shutdown();
    LOG_INFO << "FileServer - done";
  }
}

int main(int argc, char* argv[])
{
  LOG_INFO << "pid = " << getpid();
  if (argc > 1)
  {
    g_file = argv[1];

    EventLoop loop;
    InetAddress listenAddr(2021);
    TcpServer server(&loop, listenAddr, "FileServer");
    server.setConnectionCallback(onConnection);
    server.setWriteCompleteCallback(onWriteComplete);
    server.start();
    loop.loop();
  }
  else
  {
    fprintf(stderr, "Usage: %s file_for_downloading\n", argv[0]);
  }
}



eNSP模拟器中FTP文件传输 华为模拟器eNSP中配置ftp 阅读详情

相关推荐

如何使用Air724UG模组进行FTP文件传输?一篇带你搞定!

文件传输协议(FTP)是一种用于在网络上进行文件传输的协议。它支持文件的上传和下载,广泛应用于各种设备和服务器之间的文件交互。FTP使用客户端-服务器模式,客户端通过向服务器发送命令来请求文件传输服务。

xxh_success的博客 1212

(P43)muduo库使用例子(二):文件传输

文章目录1.文件传输 1.文件传输 文件传输(MuduoManual.pdf P57) eg: 42\jmuduo\examples\filetransfer\download.cc 42\jmuduo\examples\filetransfer\download2.cc examples/filetransfer/download3.cc eg测试: tests/Filetransfer_test.cc 23:10 ...

喜欢打篮球的普通人 794

43、远程连接与文件传输全攻略

本文全面介绍了远程连接与文件传输的多种实用方法,涵盖VNC、rdesktop、tsclient和FreeNX等远程桌面工具的使用步骤与技巧,并详细讲解了通过GNOME桌面、命令行和图形化客户端进行FTP文件传输的操作流程。同时探讨了点对点文件共享的应用及未来技术发展趋势,帮助用户在不同系统间高效、安全地实现远程访问与数据交换。

t4y5u6i7o的博客 52

muduo库使用示例之文件传输filetransfer

文件传输(发送)有下面3个版本,代码实现在muduo\examples\filetransfer 目录中。 版本1:一次性将文件读入内存并发送 一次性将文件读入内存中的string fileContent,一次性调用send(const string&amp;)发送完毕。==&gt; 缺点:消耗内存很大 注解1:send函数是非阻塞的,立刻返回。不用担心数据什么时候发送给对等方。这个由网络库mud...

JaweG 1428

Muduo_网络库使用手册

Muduo_网络库使用手册

随机变量序列 收敛 检验 matlab,利用MATLAB验证样条插值的收敛性

问题提出多项式插值是不收敛的,即插值的节点多,效果不一定就好。对样条函数插值又如何呢?理论上证明样条插值的收敛性是比较困难的,但通过本实验可以验证这一理论结果。.实验内容请按一定的规则分别选择等距或者非等距的插值节点,并不断增加插值节点的个数。考虑实验2.1中的函数或选择其他你有兴趣的函数。(中函数)。实验要求(1)随节点个数增加,比较被逼近函数和样条插值函数误差的变化情况。分析所得结果并与拉格朗...

weixin_30895121的博客 4735

muduo库的学习9---TcpServer与TcpClient的基本设计---TcpConnection成员

TcpConnection是muduo库里面最复杂的类。 其复杂性来自于TCP连接固有的复杂性,包括连接建立、连接断开、数据发送、数据接收。 后面的章节会针对这4个内容详细讲解。 1.类的结构 class TcpConnection { /*********************Function Member***********************************

山鸡哥的专栏 508

【LVGL】学习笔记--(3)界面切换以及显示优化

界面切换和帧率优化

sinat_33408502的博客 1万+

net9. Tcp连接类——TcpConnection

TcpConnection类 TcpConnection用来表示一个 TCP 连接, 不可再生, 如果这个连接断开, 那么该TcpConnection就失去了意义 TcpConnection中包含有封装好的读写 buffer, 用来收发数据 TcpConnection的生命周期由智能指针shared_ptr来管理, 具体在下面的注释中有 TcpConnection对象有四个状态, 表示连接的正在建立, 建立完成, 处于断开 (TcpConnection不主动关闭一个连接,都是等客户端主动关闭), 已经断开

TABE_的博客 1117

Android开发中StateFlow与LiveData的5个关键区别及实战避坑指南

本文深度解析了Android开发中StateFlow与LiveData的5个核心区别,包括设计哲学、生命周期管理、值更新策略、线程模型及协程生态整合。通过实战代码对比,为开发者在现代MVVM架构下的状态管理选型提供清晰的决策指南和避坑建议,帮助构建更健壮、可测试的应用。

weixin_29012677的博客 402

ISO 15118-20标准深度解读【精简篇】

ISO 15118-2 是开创者,它解决了“如何让电动汽车充电像给手机充电一样简单(即插即用且自动付费)”的问题,为行业奠定了基础。 ISO 15118-20 是革新者,它站在前者的肩膀上,回答了一个更宏大的问题:“如何让电动汽车深度融入未来的能源系统和智慧城市?” 它不仅是充电协议,更是一个车网互动的综合能源管理协议。简单来说,ISO 15118-2 是关于“如何充电”,而 ISO 15118-20 是关于“如何智慧地使用和管理电动汽车这块大电池”。

网络安全的研究者、新能源行业的追求者 1925

muduo网络库示例(聊天服务器)

聊天服务器(MuduoManual.pdf P66) examples/asio/chat/server.cc 单线程 examples/asio/chat/server_threaded.cc,多线程TcpServer,并用mutex来保护共享数据mutex examples/asio/chat/server_threaded_efficient.cc,借shared_ptr实现copy-on-write的手法来降低锁竞争 examples/asio/chat/server_threaded_hi

侯彩桦 1303

QCC305x-QCC304x系列开发教程之应用程序子系统详解 嵌入式

本文对QCC305x-QCC304x系列芯片的应用程序子系统进行了详细解析,并给出了一个LED闪烁的示例代码。嵌入式系统的开发既需要理论知识的支持,也需要实践经验的积累,希望本文能够为读者在QCC305x-QCC304x系列芯片的开发中提供一些有益的指导。QCC305x-QCC304x系列芯片提供了丰富的外设接口,包括UART、SPI、I2C等,开发者可以根据需求选择适合的接口进行数据传输和控制。QCC305x-QCC304x系列芯片的应用程序子系统是整个嵌入式系统的核心部分,负责管理和执行各种应用程序。

CodeMaven的博客 225

【Java】文件传输服务器端和客户端

思路: 客户端发送文件给服务器端,服务器端负责接收文件并存储。 下列代码测试通过,在IDEA中新建两个工程,每个工程的文件如下: 文件传输服务器端: import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class Server { private static final int PORT = 8888; public static void main(String[] args)

qq_30885821的博客 627

RK3588平台开发系列讲解(项目篇)常见模型结构

📢 AI 模型常采用人工神经网络来模拟人脑神经的记忆和处理信号的能力。常见的人工神经网络类型有深度神经网络(Deep Neural Network,DNN)、卷积神经网络(Convolutional Neural Network,CNN)、循环神经网络(Recurrent Neural Network,RNN)等。

内核笔记 1757

Qt代码-软件商店

ui->statusBar->showMessage(QString("%1 已卸载").arg(app["name"].toString()));ui->statusBar->showMessage(QString("开始下载 %1...").arg(app["name"].toString()));QString("%1 已下载完成,是否立即安装?ui->statusBar->showMessage(QString("%1 下载完成").arg(app["name"].toString()));

寒寒豆豆软件公司的博客 111

利用TCP协议完成服务器与客户端之间文件传输

利用TCP文件传输协议模拟与服务器的文件上传、下载操作,以及进入各种目录和列举当前目录文件状态操作。ls为查看当前目录,cd+目录名进入该目录,cd …则返回上一级目录,dow加文件名则下载文件到本地代码所在的工作目录,snd加文件名则上传本地代码所在工作目录的文件到当前查看服务器所在的目录,quit则退出。 创建文件夹 首先在本地客户端源代码的工作目录下创建一个fil的目录文件,为文件上传和下载...

wjy741223284的博客 2392

基于STM32L4XX、HAL库的ICM-42670-P姿态传感器驱动程序设计

sprintf(buffer, "温度: %.1f °C\r\n\r\n", sensor_data.temperature);sprintf(buffer, "陀螺仪: X=%.2f Y=%.2f Z=%.2f rad/s\r\n",sprintf(buffer, "加速度: X=%.2f Y=%.2f Z=%.2f m/s²\r\n",sprintf(buffer, "开始校准IMU,请保持传感器静止...\r\n");sprintf(buffer, "读取传感器数据失败\r\n");

zhusl6688的博客 641

两系统 文件传输 Java

我整理的一些关于【Java】的项目学习资料(附讲解~~)和大家一起分享、学习一下:https://d.51cto.com/bLN8S1两系统文件传输的 Java 实现 在现代的应用程序中,系统之间的信息传输显得尤为重要。尤其是在企业级应用中,不同系统间的文件传输成为了日常操作的一部分。本文将介绍如何使用 Java 实现两...

weixin_41234381的博客 435

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

文件传输方式更新—Croc

一种新型文件传输应用

teacher_bu的博客 1665

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

43.240.75.X服务器是什么,有什么作用?

什么是德迅云安全服务器

dexunyun的博客 1233

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

linux 文件传输完成,linux文件传输

Linux下几种文件传输命令 sz rz sftp scp最近在部署系统时接触了一些文件传输命令,分别做一下简单记录:1.sftp常用来在两台linux之间传输文件Secure Ftp 是一个基于SSH安全协议的文件传输管理工具。由于它是基于SSH的,会在传输过程中对用户的密码、数据等敏感信息进行加密,因此可以有效的防止用户信息在传输的过程中被窃取,比FTP有更高的安全性。在功能方面与FTP很类似...

weixin_42393829的博客 270

scp使用

scp -r user_name@43.224.34.73:/home/lk /root

Nicola.Zhang 895

『Linux』scp 文件传输命令详解

第3,4个没有指定用户名,命令执行后需要输入用户名和密码,第3个仅指定了远程的目录,文件名字不变,第4个指定了文件名。第1,2个指定了用户名,命令执行后需要输入用户密码,第1个仅指定了远程的目录,文件名字不变,第2个指定了文件名。-i identity_file 从指定文件中读取传输时使用的密钥文件,此参数直接传递给ssh。-o ssh_option 如果习惯于使用ssh_config(5)中的参数传递方式,-F ssh_config 指定一个替代的ssh配置文件,此参数直接传递给ssh。.........

ReturnTmp的博客 4696

python Socket文件传输代码

环境: Ubuntu16.04 Python3.5 客户端代码: import socket import tqdm import os #设置服务器的IP和端口 SERVER_HOST="192.168.43.207" SERVER_PORT=5001 #设置文件读写的缓冲区 BUFFER_SIZE=4096 # 传输数据分隔符 SEPARTOR = "<SERPARTOR>" #创建server s=socket.socket() s.bind((SERVER_HOST,SERVER_PO

qq_33287871的博客 409

使用OpenWRT配置SFTP远程文件传输,安全高效的文件传输方法

本次教程我们将在OpenWRT上安装SFTP服务,并结合cpolar内网穿透,创建安全隧道映射22端口,实现在公网环境下远程OpenWRTSFTP,安全地传输文件,比如备份文件、配置文件等。SFTP是一种安全文件传输协议,它基于SSH协议,提供了加密、认证和数据完整性保护的安全文件传输服务。cpolar是一个安全且强大的内网穿透工具,它可以通过安全隧道将NAT或防火墙后面的本地服务器,暴露给公共互联网。用过一段时间后你会发现,它甚至还可以直接在家中实现小型的云服务。

ZL_1618的博客 1087
上一篇: muduo_inspect库源码分析(41)
下一篇: 四个 服务器设计模型(42)
laohan_
博客等级 码龄15年 112粉丝 224原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值