网络编程
文章平均质量分 75
他过江
分享C/C++/Linux/Qt/音视频/FFmpeg/OpenCV等相关技术。
展开
-
单线程reactor支持百万连接
C1000K目的测试单线程reactor能否支持百万连接。1个连接由5元组唯一确定:local_iplocal_portpeer_ippeer_portprotocal已知ubuntu-1604的默认的端口范围:32768-60999假设client有20000个端口能用,server开100个端口,用2个client去连接server,则理论最大连接数是:20000 x 100 x 2 = 400万。代码修改在reactor的基础上,server开启100个监听端口。虚拟机配原创 2021-12-11 03:19:39 · 2247 阅读 · 0 评论 -
350行C代码实现epoll reactor模型
有了epoll为什么还需要reactor?响应快,不必为单个同步事件所阻塞,虽然 Reactor 本身依然是同步的; 编程相对简单,可以最大程度的避免复杂的多线程及同步问题,并且避免了多线程/进 程的切换开销; 可扩展性,可以方便的通过增加 Reactor 实例个数来充分利用 CPU 资源; 可复用性,reactor 框架本身与具体事件处理逻辑无关,具有很高的复用性;reactor的思想:将对IO的处理转化为对事件的处理。reactor包括5个部分reactor管理器 注.原创 2021-12-10 16:36:30 · 1923 阅读 · 0 评论 -
180行C代码实现epoll echo server
#include <sys/epoll.h>#include <sys/socket.h>#include <stdio.h>#include <netinet/in.h> // sockaddr_in#include <netinet/ip.h>#include <arpa/inet.h> // inet_addr#include <errno.h>#include <string.h>#...原创 2021-11-14 23:50:08 · 1053 阅读 · 0 评论 -
epoll读写事件触发的条件
先上个人理解:EPOLLIN(读事件)EPOLLOUT(写事件)以下触发条件只要满足一点即可。LT模式:EPOLLIN触发条件:处于可读状态。 从不可读状态变为可读状态。EPOLLOUT触发条件:处于可写状态。 从不可写状态变为可写状态。说白了,LT模式就是能读的时候就可读,能写的时候就可写。这并不是废话。什么叫可读状态?什么叫不可读状态?一个水杯里有水...原创 2019-10-13 00:18:10 · 7589 阅读 · 4 评论 -
基于IOCP的HTTP服务器
本项目的重点是IOCP,至于HTTP服务,暂时只实现了GET方法,在浏览器输入IP:端口,则返回hello字符串。后面有空继续实现HTTP协议的其它方法。首先对于一个服务器,首先要解决以下几个问题:如何检测有新客户端连接? 如何接受客户端连接? 如何检测客户端是否有数据发来? 如何收取客户端发来的数据? 如何检测连接异常?发现连接异常之后,如何处理? 如何给客户端发送数据? 如...原创 2019-07-28 19:09:30 · 1377 阅读 · 2 评论 -
socket选项SO_REUSEADDR和SO_REUSEPORT对比
首先,TCP/UDP连接是一个五元组(protocal, src addr, src port, dst addr, dst port)BSD是其它socket实现标准的鼻祖,这里以BSD为例:SO_REUSEADDR:允许两个socket绑定(bind)到不完全相同的(ip, port)二元组该选项有两个作用:1. 允许前后两个socket绑定到通配地址(0.0.0.0)和具体的...原创 2019-07-30 20:30:29 · 1068 阅读 · 0 评论 -
IOCP投递多个WSARecv存在的问题
看完A simple IOCP Server/Client Class发现 IOCP投递多个WSARecv存在3个问题:1. 多个pending recv,多个worker,数据包会乱序。解决方法:可以通过给数据包加序号解决。但是不确定性能能提高多少,codeproject的作者对多worker的处理是只有一个pending recv2.多个pending recv,多个work...原创 2019-07-16 20:59:21 · 1719 阅读 · 0 评论 -
socket选项LINGER介绍
以winsock为例。typedef struct linger { u_short l_onoff; u_short l_linger;} LINGER, *PLINGER, *LPLINGER;该选项可用来设置关闭socket的行为。用法:LINGER lingerStruct;// If we're supposed to abort the connectio...原创 2019-07-04 22:49:44 · 3798 阅读 · 4 评论 -
非阻塞connect用法
在广域网中,connect函数可能需要比较长的时间返回(等待对端发送ack),所以我们通常需要非阻塞connect。下面分别实现windows和linux的非阻塞connect,并作出对比。先大概总结一下winsock和linuxsocket用法区别:winsock需要WSAStartup和WSACleanupleanup进行初始化和反初始化,linuxsocket不用 关闭套接字,...原创 2019-06-24 23:23:47 · 5296 阅读 · 2 评论 -
基于select模型的windows网络库libet(三)EventBase
EventBase.h#pragma once#include <memory>#include <WinSock2.h>#include "Global.h"#include "Threads.h"#include "Buffer.h"struct EventBases : private noncopyable { virtual EventB...原创 2019-01-30 00:32:52 · 189 阅读 · 0 评论 -
基于select模型的windows网络库libet(二)TcpConn
TcpConn.h#pragma once#include <assert.h>#include <atomic>#include "Global.h"#include "Buffer.h"#include "Net.h"#include "Util.h"struct TcpConn : public std::enable_shared_from_...原创 2019-01-27 22:31:16 · 303 阅读 · 0 评论 -
基于select模型的windows网络库libet(一)TcpServer
TcpServer.h#pragma once#include <WinSock2.h>#include <memory>#include <assert.h>#include "Global.h"#include "Codec.h"#include "Net.h"#include "Util.h"struct TcpServer : ...原创 2019-01-16 23:08:32 · 650 阅读 · 0 评论 -
基于select模型的windows网络库libet(六)Slice
Slice.h#pragma once#include <string>#include <vector>//Slice作为Buffer的扩展,只维护Buffer的指针,不具有自己的内存//所以要确保Slice在Buffer的生命周期内使用class Slice {public: Slice() : pb_("") { pe_ = pb_; } S...原创 2019-01-31 18:38:03 · 262 阅读 · 0 评论 -
基于select模型的windows网络库libet(五)Buffer
Buffer.h#pragma once#include <algorithm>#include <string>#include "slice.h"//#include "Logger.h"//D_SCL_SECURE_NO_WARNINGS//_SCL_SECURE_NO_WARNINGS//std::copy : _DEPRECATE_UNCH...原创 2019-01-31 18:17:36 · 218 阅读 · 0 评论 -
基于select模型的windows网络库libet(四)PollerBase
PollerBase.h#pragma once#include <atomic>#include <memory>#include "Global.h"#include "Util.h"//轮询器struct PollerBase : private noncopyable{ PollerBase() : m_lastActive(-1) {...原创 2019-01-31 18:02:58 · 218 阅读 · 0 评论 -
Qt中处理Tcp粘包
处理粘包的方式是在消息头部加上消息总长度。采用该格式:消息总长度len(4字节)+命令字commandId(4字节)+消息msg。思路是用一个buffer,每次有消息就读完,然后判断buffer长度,收到四字节长度len后,根据len收消息,当buffer.size()>=len,这时已经收到一个完整的包就可以处理了,处理完后就将buffer前len个字节删除掉,如此反复。...原创 2019-01-09 23:01:44 · 3560 阅读 · 0 评论 -
参考handy网络库修改的轻量级windows网络库libet
最近参考开源网络库handy,整合了一个符合我场景的网络库—libet,适用于windows平台。现在我想先从整体架构上说明libet。libet跟handy库一样,存在很多的回调函数。先介绍基本的类:TcpServer: 用于绑定IP,端口,处理Tcp连接。 TcpConn: 处理连接中的读,写。 Channel: 维护一个fd的通道,处理读写。 EventBase: 事件...原创 2019-01-08 23:30:44 · 784 阅读 · 0 评论