首页 > 其他分享 >通过send函数发送10GB的数据,epoll

通过send函数发送10GB的数据,epoll

时间:2024-05-30 17:13:00浏览次数:19  
标签:socket epoll 10GB send 发送 缓冲区 数据

在处理大量数据发送时,如尝试通过send函数发送10GB的数据,由于TCP socket缓冲区大小限制,单次send调用可能并不会完全发送所有数据。例如,首次调用可能仅成功发送约256KB的数据,之后再次调用send可能会因为缓冲区已满而立即返回错误码EAGAIN,这表明必须等待缓冲区有更多空间才能继续发送。

在这种情况下,对于异步编程模型,使用epoll_wait来监听文件描述符(在这个场景中是socket)的状态变化是一个标准做法。当缓冲区中的数据网络协议栈逐步传输给对方并腾出空间后,epoll_wait会收到一个EPOLLOUT事件,指示现在可以安全地再次尝试写入数据到socket。

正确的处理流程概括如下:

  1. 初始化:首先,设置socket为非阻塞模式,并使用epoll_create创建一个epoll文件描述符。

  2. 注册事件:通过epoll_ctl向epoll实例注册关注的socket,关注的事件为EPOLLOUT,表明我们关心该socket何时准备好进行写操作。

  3. 发送数据:开始发送数据,使用循环调用send,直到全部数据发送完毕或send返回EAGAIN,这表明当前不能再发送更多数据。

  4. 处理EAGAIN:当send返回EAGAIN时,不应当视为错误,而是应当暂停发送,转而等待EPOLLOUT事件。

  5. 等待事件:调用epoll_wait等待事件。当socket可写(即缓冲区有了更多空间),epoll会返回该socket的EPOLLOUT事件。

  6. 继续发送:收到EPOLLOUT事件后,根据之前记录的已发送数据位置,继续从该位置开始发送剩余数据,重复步骤3至5,直到所有数据发送完毕。

  7. 清理与注销:数据发送完成后,不要忘记清理相关的状态信息,并根据需要注销epoll对该socket的关注。

通过上述流程,可以高效且可靠地处理大数据量的异步网络通信,确保数据完整发送,同时避免因缓冲区满而导致的阻塞问题。

标签:socket,epoll,10GB,send,发送,缓冲区,数据
From: https://www.cnblogs.com/yubo-guan/p/18222744

相关文章

  • go net/http send req
      之前写到net/http客户端发送http请求时,会开启HTTP事务发送HTTP请求并等待远程的响应,经过下面一连串的调用,我们最终来到了标准库实现底层HTTP协议的结构体— net/http.Transport:net/http.Client.Donet/http.Client.donet/http.Client.sendnet/http.sendnet/htt......
  • c# 通过 SendMessage 实现跨进程数据通信
    usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.IO.MemoryMappedFiles;usingSystem.Runtime.InteropServices......
  • 理解Solidity 中的 tx.origin 和 msg.sender
    开发者需要了解在Solidity中tx.origin和msg.sender的区别。这两个全局变量经常被混淆,尽管它们之间有着根本的不同。虽然乍一看它们可能相似,但在交易的上下文中,tx.origin和msg.sender代表不同的地址。在这篇博客文章中,我们将深入探讨这些变量的含义。什么是tx.origin?在Soli......
  • 非阻塞sokcet和epoll
    在Muduo网络库中同时使用了非阻塞socket与epoll,在此简单梳理下。非阻塞sokcet和epoll共同工作的过程主要涉及网络编程中的非阻塞I/O和事件驱动机制。下面将详细解释这两者如何协同工作:非阻塞socket简介在传统的阻塞socket编程中,当调用如read、write、accept等函数时,如果当......
  • 【Muduo】三大核心之Poller、EPollPoller
    Poller在Muduo中,Poller负责基于IO多路复用机制进行IO事件监听和处理的组件,作为EPollPoller的基类,为后者提供了与PollPoller统一的IO复用接口,并且声明了一个关键的创建派生类的成员函数:staticPoller*newDefaultPoller(EventLoop*loop);此函数可以通过判断`::getenv("MUD......
  • 4/7一文讲透网络传输流程 epoll内核模型 reactor用户空间处理模型
    epoll是内核如何将由层层协议栈去除tcp头,根据四元组查socket文件,将sk_buffer放到socket接受队列的 reactor  五种IO模型,三种线程处理模型     回溯算法之全排列 将所有需要用到的数组包括路径数组状态数组都初始化好然后都放进dfs参数里面 这......
  • epoll_event
    epoll_event是Linux内核提供的一个数据结构,用于在epoll机制中表示事件。epoll是一种高效的I/O事件通知机制,通常用于处理大量并发连接。epoll_event结构体定义在<sys/epoll.h>头文件中,主要用于传递文件描述符及其相关的事件类型。epoll_event结构体的定义如下:struct......
  • IO多路复用:Select, Poll与Epoll
    IO多路复用:Select,Poll与Epoll参考:EPOLL原理详解(图文并茂)一、网络数据是如何被接收的网卡接收到网络数据将网络数据暂存到内存当中(DMA传输技术)网卡向CPU发起硬件中断CPU执行中断处理函数,将内存中的数据存储到socket文件描述符中,并唤醒相关进程Q1:如何知道要将网络数据......
  • 群晖ds1517+解决第三方Marvell AQC107 10Gbe网卡驱动问题
    群晖ds1517+解决第三方MarvellAQC10710Gbe网卡驱动问题转载注明来源:本文链接来自osnosn的博客,写于2024-05-15.说明这是网友mohawk解决问题的经过,征得同意后,贴在这里。给大家参考。背景好友打算升级到全屋有线万兆2.5g网络,陆续装备了路由器、交换机等,但家里的群晖ds......
  • epoll、poll、select
    `epoll`、`select`和`poll`都是在Linux系统中用于实现I/O多路复用的机制,它们都能够实现在多个文件描述符上进行非阻塞的I/O操作,并在有I/O事件发生时通知应用程序。以下是它们的一些比较:1.**`select`**:-`select`是Unix系统最早的一种多路复用机制之一。-它......