linux如果错误码是eagain代表什么

嘿,当我编写那个程序时,我将套接字设置为相同,以为我可以在做其他事情的同时发送数据。
结果使用write发送了写数据,大小非常大。
我当时并没有想太多。
然后,我突然看到错误消息说资源暂时不可用。
我当时就很困惑,想知道这是怎么回事,是不是不同步了?为什么资源还没有呢?
后来我意识到这是因为发送缓冲区已满。
同样,发送数据后,write返回,不管对方在不在。
该缓冲区即将填满,并且 write 返回错误,要求我重试。
嘿嘿,这个EAGAIN其实是叫我下次再试一次。

此错误通常在以非阻塞模式运行文件或套接字时发生。
例如,如果使用 O_NONBLOCK 标志打开文件或套接字,然后连续读取,如果没有数据可读取,则读取将返回 EAGAIN 并稍后重试。
再比如,像fork这样的系统调用,如果因为资源不足而失败,也会返回,下次再试。

在Linux下,当连接到非限制套接字时,EAGAIN要么告诉我这是一个错误,要么告诉我没有数据可读取,并要求我下次接收。
在 VxWorks 和 Windows 上,它称为 EWOULDBLOCK。
另外,EINTR为errno 4 ,这意味着系统调用已被中断,操作必须继续。
receive返回0,连接断开,接收操作必须完成。

当我当时写代码时,当read再次返回时,循环继续。
如果读取返回 EAGAIN 以外的任何内容,则会输入错误并返回错误代码。
嘿,现在我想了一下,我应该先检查返回值,而不是 EAGAIN,然后继续循环。

您可以查看这个网站http://www.linuxprobe.com/chapter-00以获取更多Linux故障排除信息。
希望这有帮助。

C++网络库都干了什么?--CppNet

cppnet主要用于异步非阻塞套接字通信。

在Windows上,它使用WSASocket来创建异步套接字。
然后在 Linux 上,通过 fcntl 更新套接字属性并添加 O_NONBLOCK 标志以使其成为非阻塞模式。

对于事件通知机制; Windows中使用IOCP来监控数据的发送和接收。
在 Linux 上使用 epol 监视套接字发送和接收事件。

cppnet实现了Proactor模式。
该模式允许操作系统执行IO操作并在操作完成时通知应用程序。
与Reactor模式相比,Proactor模式允许应用程序做更多的工作。

通过__linux__等宏定义跨平台抽象,并在编译内选择不同的实现代码。
网络事件驱动程序被归类为虚拟基类。
不同的平台继承这个基类并实现特定的接口。
Linux 上的 epoll; cppnet以Proactor模式包装它,并在其之上添加一层来实际调用网络收发器接口。

关于数据处理; Linux 上采用边沿触发的 ET 模式读取数据,以避免 LT 模式效率问题。
边沿触发可确保在事件触发器中读取所有数据,以避免饥饿。

缓存管理; cppnet 使用循环缓冲区数据结构,它是固定大小内存块的列表。
两个标记控制循环读取和写入以减少内存副本。

用于读写操作;在Linux上使用writev和readv缓冲区来集中写入和分散读取,以减少数据副本的数量。

连接管理;加入事件触发模型,避免非阻塞模式下接收阻塞等连接请求。
Windows 上的 IOCP 自动确定哪个线程返回执行连接操作。
在Linux中,操作系统通过设置套接字的SO_REUSEADDR标志并将多个套接字绑定到同一端口来控制唤醒哪个线程。

其他辅助功能;线程池管理; IOCP Windows 中线程池的间歇管理。
Linux中,cppnet初始化参数控制; epollhandle 由多个线程使用,或者每个线程应该构建自己的。

在cppnet上进行调试和日志记录,方便故障排除和运维。

建筑草图、标记界限;图片链接格式显示;实际打标环境可以正常显示。

cpp网异步非阻塞套接字通信;跨平台;高效的数据处理;一个C++网络库,主要执行连接管理和其他辅助功能。
这些功能的总和就是cppnet的核心竞争优势。
它可以有效地处理网络通信任务。