MarioTCP:一个可单机支持千万并发连接的TCP服务器

ModbusTCP_Master V2.0:物联网应用的TCP通信模拟工具 Modbus协议作为工业通信协议的标准之一,以其简单、高效、开放的特点在全球范围内被广泛接受和应用。它最初由Modicon公司开发,用于实现可编程逻辑控制器(PLC)之间的通信。随着技术的进步,Modbus协议也经历了数次扩展,增加了TCP/IP网络通信的能力,形成了Modbus TCP协议。Modbus协议是一种应用层的协议,它定义了一个控制器能够认识和使用的消息结构,而不考虑通信网络的具体实现。Modbus支持多种功能码,每个功能码对应不同的操作,例如读取保持寄存器、读取输入寄存器等。 阅读详情

MrioTCP,超级马里奥,顾名思义,他不仅高效,而且超级简易和好玩。同时他可以是一个很简洁的Linux C 开发学习工程。毫不夸张的说,如果全部掌握这一个工程,你会成为一个Linux C的牛人;当然,你也可以通过源码包的mario.c(maritcp服务器示例程序)来学习,可以很快入门上手进行Linux C开发。

经过两个多月的测试(编写c++客户端测试及调优系统参数),测试结果得到单机最大带宽吞吐1000M,测试最高TCP长连接100万,每秒处理连接数达4万,此时系统压力load值很低。总之,它可以发挥一台服务器的最大极限以提供最高性能的服务;而且经过完备测试,运行稳定且占用系统资源非常少。

Getting Started

用MarioTCP来建立一个性能强大的TCP服务器非常简易!

  工程源码包就是一个非常简洁的例子,生成了一个tcp服务器程序:maritcp。
  源码包中:
  mario.c是简易例子的main程序,直接make可以编译出maritcp,一个tcp服务器,业务逻辑只有一个功能:统计同时在线socket数、每隔1分钟输出一次。
  mario文件夹,MarioTCP的核心代码,make可以直接编译出静态的libmario.a。MarioTCP核心架构后续会介绍。
  test文件夹,是一个稍显简陋的客户端测试程序,通过与服务器建立连接、发送LOGIN包登陆服务器,此时maritcp服务器会使同时在线加1,客户端断开时服务器在线数减1。

现在讲一下如何定制一个自己业务逻辑的tcp服务器,只需五步:
  1、初始化SERVER
  SERVER *server = init_server(conf->port, conf->workernum, conf->connnum, conf->timeout, conf->timeout);
  传入参数分别是:
  服务器Listen端口,工作线程数,每个线程支持的连接数,读超时时间,写超时时间。
  workernum * connum 就是服务器支持的长连接数,一个worker可以轻松支持10万长连接。

2、实现业务逻辑函数并注册
  具体业务逻辑函数请见Function模块。可通过mario.h中定义的名为“regist_*”的函数来注册。

/*
  *  注册业务处理函数
  /
  void regist_akg_func(uint16 id, FUNC_PTR func);
  id可以是0-65535的任意数,此id封装在MarioTCP的协议中(见本文最后)。
  id的范围,可以根据业务逻辑来定制,例如maritcp通过protocol.h中定义的CMD结构体来设定:
  typedef enum _CMD {
  CMD_FUNCTION_BASE = 0x6100,
  CMD_FUNCTION_LOGIN = 0x6101
  } CMD;

如果你想为maritcp增加一个"say_hello"的服务,可以这么做:
  1)在CMD中增加:CMD_FUNCTION_SAY_HELLO = 0x602
  2) 在function中增加函数:
  sint32 say_hello(CONN c) {
  I)通过CONN来解析客户端发过来请求的参数
  II)将“hello”设定到c->out_buf
  III)bufferevent_write(c->bufev, c->out_buf, hrsp->pkglen);
  IV)return 0;
  }
  3)在mario.c中增加:regist_akg_func(CMD_FUNCTION_SAY_HELLO, say_hello);

怎么样?自己定制业务逻辑,还是很简单高效吧!

3、启动日志线程start_log_thread()
  MarioTCP的日志功能封装还不够好,在“go on 1.0.0”页面中继续讨论...

4、启动服务器start_server((void*) server);
  OK,一个可以支持100万甚至更多长连接的TCP服务器,诞生了!

Go On 1.0.0

第一个发布版本为0.9.9,尽管用这个包,通过几分钟就可以实现一个定制了你的业务逻辑的、稳定高效的TCP服务器,但是MarioTCP还有很多有待完善的地方,让我们一起尽快解决如下问题,让MarioTCP-1.0.0尽快发布!


1、MarioTCP协议如何优化
  为了使MarioTCP足够安全,规定了一个简易的MarioTCP协议,经过三次握手连接到MarioTCP的client,接下来发的包要求格式必须是“HEAD+Data”的形式,而HEAD结构体定义在mario_akg.h中:
  typedef struct _HEAD {
  uint32 stx;
  uint16 pkglen;
  uint16 akg_id;
  } HEAD;
  pkglen是整个包的长度,即“HEAD+Data”。
  akg_id及自定义的业务逻辑函数对应的id,例如“Getting Started”页面中的CMD_FUNCTION_SAY_HELLO
  stx是你自定义的协议密文,通过regist_stx(uint32 stx)来注册(见mario.c)

尽管MarioTCP的协议足够简单了,而且协议最开头的密文可以自定义,但是是否可以更简单或者无协议,以最大程度的方便开发使用,需要大家的建议和帮助!

2、日志系统过于死板
  MarioTCP有一套自成系统的日志功能,但是比较晦涩难懂。
  接下来再展开...

3、业务逻辑稳定性支持
  MarioTCP对于网络连接和读写,非常高效和稳定。
  但是MarioTCP的线程池是固定个数的,且是全局唯一初始化的,死掉的线程不可再重启;分配网络任务的Master线程不具备监听worker的功能,一个线程死掉了、任务却还会一直分配过来,造成服务堆积且不处理。如果业务逻辑如果非常复杂和低效,就会出现这个问题。
  在大型线上项目中,用到MarioTCP的地方,都会通过业务逻辑模块的监听、告警及程序自动处理来避免上述问题。由于时间问题还没有把此功能抽象到MarioTCP中。

  这件事情,近期我会抓紧处理。也希望有朋友建议和帮助!!

Why Supper

一、为什么超级高效
  1、网络服务用到的所有结构体和内存都是启动程序时初始化的,无销毁,无回收。
  无销毁好理解,不解释。
  无回收,是指所有内存单元拿来即用,用完及可,不用做reset操作。
  2、一个master线程进行accept
  经过测试发现多进程或线程进行accept和一个进程或线程accept,在极限压力下区别不大。
  一个master比多个master好在不用再通过锁来解决同步问题。
  3、master与worker时单一生产者消费者模式,完全无锁通信
  不光accept无锁,分配connection、后续的conncetion处理都是无锁的。
  甚至业务逻辑(见示例maritcp的统计在线数功能)、MarioTCP的日志系统(这也是日志系统抽象不够的一个原因,之前的设计太依赖于整体架构了)都是无锁处理的!
  4、一个worker一套libevent环境
  libevent处理10万长连接的网络读写事件,其性能达到最大化了。
  每个worker都独立一套libevent,这个结构经过测试,发现开销很小、性能很高。

二、单机百万长连接、四万cps(连接每秒)如何做测试得来
  1、设置系统最大文件数为unlimited
  2、设置系统的tcp内存内核参数到256M以上
  3、设置系统的ip到15个,那么可服务的长连接数理论上最少15*(65535-1024)个
  4、用epoll或libevent开一个可同时连接5w的客户端程序;程序还要实现每秒随机挑选1000个连接断掉,并再新创建1000个连接。另外在随机挑选几千连接发包。
  同时再多台机器上开启20个客户端,那么就是100w长连接,每秒2w个连接断掉、2w个新连接加入进来,并且有若干包发过来。
  5、设置服务端可重用SYN_WAIT的连接;客户端断连接的方式是主动断掉(防止客户端程序端口堆积)
  总之很折腾的一个测试,前前后后大约2个多月才测试完毕。
  以上内容凭记忆写的,怕有错误或疏漏,回头为了公布测试代码和测试结果给大家,会再次开发、测试并调整补过上述内容。

毕业设计论文范文源码-mariotcp:高性能tcp服务器 毕业设计论文范文源码 MarioTCP:一个可单机支持千万并发连接的TCP服务器 请注意: 过去几年有不少朋友加我,心想对不住大家了,建个群聚聚大家伙,请大家群里畅所欲言…请加QQ群:564994650, 里面有不少linux c的研发同学:) MrioTCP,超级马里奥,顾名思义,他不仅高效,而且超级简易和好玩。同时他可以是一个很简洁Linux C 开发学习工程。毫不夸张的说,如果全部掌握这一个工程,你会成为一个Linux C的牛人;当然,你也可以通过源码包的mario.c(maritcp服务器示例程序)来学习,可以很快入门上手进行Linux C开发。 经过两个多月的测试(编写c++客户端测试及调优系统参数),测试结果得到单机最大带宽吞吐1000M,测试最高TCP长连接100万,每秒处理连接数达4万,此时系统压力load值很低。总之,它可以发挥一台服务器的最大极限以提供最高性能的服务;而且经过完备测试,运行稳定且占用系统资源非常少。 他是建立在Sourceforge上的一个开源项目,由源码的作者冯建华(JohnFong)发起。源码可以在Sourceforge上下载。 sourcefo 立即下载

相关推荐

从MRF8P9040N数据手册到ADS仿真:手把手教你搞定LDMOS功放设计(附完整模型下载)

本文详细解析了MRF8P9040N LDMOS功率放大器的数据手册关键参数,并提供了在ADS中进行仿真的完整指南。从模型导入、直流工作点验证到负载牵引与阻抗匹配设计,逐步指导工程师完成高效功放设计。文章还包含调试技巧和常见问题解决方案,帮助优化射频功放性能。

weixin_27015733的博客 490

MarioTCP: Multi Libvent TCP Server 一个高性能的TCP服务器

MrioTCP,超级马里奥,顾名思义,他不仅高效,而且超级简易和好玩。同时他可以是一个很简洁的Linux C 开发学习工程。毫不夸张的说,如果全部掌握这一个工程,你会成为一个Linux C的牛人;当然,你也可以通过源码包的mario.c(maritcp服务器示例程序)来学习,可以很快入门上手进行Linux C开发。经过两个多月的测试(编写c++客户端测试及调优系统参数),测试结果得到单机最大带宽吞...

haierboos 521

手把手教你解锁TI MSPM0G3507开发板(2025新版,附XDS110接线图)

本文详细解析了2025版TI MSPM0G3507开发板的解锁方法,针对新版硬件中BSL引脚的电路设计变化提供了精准接线方案和UniFlash软件配置步骤。通过实测数据和专业指导,帮助开发者解决芯片锁定问题,确保调试接口正常响应。

weixin_42696271的博客 807

【网络编程】MarioTCP

0、参考博客 《MarioTCP_一个可单机支持千万并发连接的TCP服务器 - JohanFong - 优快云博客》 http://blog.youkuaiyun.com/everlastinging/article/details/10894493 1、下载 sourceforge下载:https://sourceforge.net/projects/mariotcp/files/late

郭老二 1048

EMC案例:解决千兆网口RTL8211F EMI问题

摘要:本文分析了Amlogic S812平台OEM项目中RTL8211F-CG千兆网卡EMI辐射超标问题。发现百兆测试时25MHz时钟有3dB余量,但千兆125MHz时钟导致超标。问题根源包括:未关闭PHY芯片悬空CLKOUT引脚、TX/RXCLK端RC位置错误、包地不完整及参考地缺失。解决方案涉及软件关闭无用时钟、优化RC布局、加强包地与打孔、调整共模电感位置,并在HDMI 3.3V加磁珠。关键结论指出千兆网125MHz时钟需严格包地打孔,且RC取值需平衡EMI与通信性能。

电子绿洲的博客 1279

UE5.3.2 + VS2022社区版在Win11上的C++编译环境配置全解

Unreal Engine 5的C++开发依赖严格的工具链协同,其核心在于Visual Studio编译器版本、Windows SDK与引擎构建系统(UBT)的精准匹配。UE5.3.2强制要求MSVC v143.4(即VS2022 17.4+)及Windows 11 SDK 10.0.22621.0,任何偏差都会引发LNK2019链接失败、C1083头文件缺失或MSB8066构建中断等典型错误。该配置不仅关乎安装顺序,更涉及注册表清理、PATH环境变量、SDK路径注入与运行时DLL加载等底层机制。适用于Wi

weixin_33978722的博客 367

【网络编程】MarioTCP 流程图(一)

郭老二 717

微信支付V2,jsapi支付拉起收银台报错:调用支付JSAPI缺少参数:total_fee

拉起收银台报错

m0_54355172的博客 3873

京东618大促网关承载十亿调用量背后的架构实践

618大促,我们的网关承载了几十亿的流量和调用,在这种情况下,网关系统必须保证整个系统的稳定性和高可用,保证高性能和可靠,以支撑业务。我们面临的是一个非常复杂的问题,基于...

weixin_45583158的博客 487

手把手教你用Siemens EDA破解工具搞定PADs VX2.7安装与卡死问题

本文详细介绍了如何使用Siemens EDA工具解决PADs VX2.7的安装与卡死问题。从License配置到性能调优,提供全面的解决方案,帮助工程师高效完成电子设计自动化任务。特别针对常见的卡顿现象,给出了输入法兼容性调整、图形性能优化等实用技巧。

k8l9m0n的博客 554

C#实战:如何用HslCommunication快速搞定三菱FX5U PLC通讯(附完整代码)

本文详细介绍了如何利用HslCommunication库在C#环境中快速实现与三菱FX5U PLC的通讯。通过实战代码演示,从环境搭建、建立连接、核心数据读写到构建健壮的监控服务,系统讲解了如何高效完成数据采集与交互,大幅提升工业自动化项目的开发效率。

s4t5u6v的博客 1202

用MarioTCP库实现一个单机10亿级的百万并发长连接

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34290352的博客 346

基于ESP32的智能无线广播系统开发博客

通过本项目的开发,我们成功地实现了基于ESP32的智能无线广播系统。该系统不仅具备传统广播的功能,还实现了通过Wi-Fi无线传输音频、实时广播和智能控制等多种先进功能。未来,随着技术的进一步发展,我们还可以扩展更多功能,如智能推荐广播内容、支持语音识别和控制等。希望本项目能够为嵌入式开发人员提供一些思路和参考,帮助大家在实际开发中更好地应用ESP32平台,开发出更加智能和实用的无线广播系统。

2201_76125393的博客 423

marioTcp

https://github.com/nicholaszj/marioTcp MarioTCP MarioTCP是使用libevent模型来建立的一个性能强大的TCP服务器. 1:Getting Started 用MarioTCP来建立一个性能强大的TCP服务器非常简易.工程源码下有一个非常简洁的例子: mario.c:是简单的main程序: 1:直接make编译出maritcp...

weixin_30337157的博客 270

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

基于 Go 的轻量级并发TCP服务器框架zinx的实现&游戏开发

文章目录引言zinx项目结构serverconnectionmsgHandlerroutermessagerequestconnmanagerdatapackglobalobj服务器创建客户端创建流程分析MMO游戏介绍玩家的上线世界聊天系统多人位置同步移动位置同步玩家下线项目结构mainaoigridplayerworldmanagerroutermoveworld_chatmsg.proto 引言 在该项目中有两个部分,一个是zinx,一个是mmo_game,zinx是一个tpc框架,而mmo_game是

迷雾总会解 8671

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

MarioTCP:一个单机可日30亿的百万并发长连接服务器

csdn上的一个并发服务器下载地址:sourceforge下载:https://sourceforge.net/projects/mariotcp/files/latest/downloadcsdn下载:http://download.youkuaiyun.com/detail/everlastinging/619560551cto下载:http://down.51cto.com/dat...

weixin_34289454的博客 127

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Modbus tcp/ip 主站请求接收从站数据

public class tcpModbus { public static void main(String[] args) { int port = Modbus.DEFAULT_PORT;   TCPMasterConnection con = null; // the connection   ModbusTCPTransaction trans = null; // th

guestpprro的专栏 6760

阿里P8面试官:如何设计一个扛住千万级并发的架构(超级详细)

如何降低RT的值 继续看上面这个图,一个请求只有等到tomcat容器中的应用执行完成才能返回,而请求在执行过程中会做什么事情呢? 查询数据库 访问磁盘数据 进行内存运算 调用远程服务 这些操作每一个步骤都会消耗时间,当前客户端的请求只有等到这些操作都完成之后才能返回,所以降低RT的方法,就是优化业务逻辑的处理。 数据库瓶颈的优化 当18000个请求进入到服务端并且被接收后,开始执行业务逻辑处理,那么必然会查询数据库。 每个请求至少都有一次查询数据库的操作,多的需要查询3~5次以上,我们假设按

互联网架构小马的博客 1万+

Java 读取 modbus slave模拟器数据 示例

1.首先安装modbus slave 模拟器,自己到网上下载破解版的 有注册码 2.新建寄存器 设置单元内数值,点击connection下面的connect,红色的No connection 字样消失 连接成功 3.java侧读取工具类,里面有不同变量类型的读取,读取方法要与modbus slave 寄存器设置的变量类型保持一致 package utils; import jav...

hujiameihuxu的专栏 4176

c语言linux TCP长连接 socket收发范例 断开自动重连

改进1:加入接收超时。可以做别的事,等有接收才响应 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <assert.h> #include <string.h> #include <netinet/in.h> #include &lt...

chenhao0568的专栏 6738

Java modbustcp 读取多个从站的数据

Java modbusTCP读取多个从站的数据 在工业控制系统中,Modbus是一种常用的通信协议,用于在控制器和外部设备之间进行数据交换。Modbus TCP是Modbus协议在TCP/IP网络上的实现,在工业控制系统中也被广泛应用。在此篇文章中,将介绍如何使用Java编程语言,通过Modbus TCP协议读取多个从站的...

weixin_35870469的博客 913

如何设计一个扛住千万级并发的架构?需要多少服务器?

阿里P8面试官:如何设计一个扛住千万级并发的架构?

u012272367的博客 7668

千万级高并发秒杀系统设计套路!超详细解读~~

曾经有一家巨头公司和我们公司进行战略合作,经过双方的不懈努力及精诚合作,双方公司决定共同举办一场秒杀活动,我们公司提供优质商品和强有力的吸引价格以及使用场景,对方公司提供巨大的用户流量,再加上我们公司自己的用户流量,粗略估算下来有5000万的用户流量。其实,当时我们的架构是完全支撑不了千万级流量的瞬时冲击的,但是双方老板已经达成协议就要快速干起来,而且给了一个基本无法完成的时间期限。由于时间紧急,...

程序猿DD 1324

基于netty如何实现百万连接

① 介绍 100w连接需要多少台机器才能构建起来,这肯定是很多的,在测试的过程中,不需要几百个服务器完成百万连接。需要注意服务器支持端口的数量是可以支持很多的,但是如何2台服务器要实现百万连接,需要考虑一个TCP层次的一种限制,两台服务器之间建立的连接数量是有限的。网络四元组(客户端IP,客户端端口,服务端IP,服务端端口)。 同一个IP的端口数不超过65535个,这是个限制,每一个连接不仅仅在服务器上开启一个端口,在客户端也会开启一个端口,每一个TCP连接涉及到端口数量的限制,客户端只有6万多个端口

javaDB_EAD的专栏 6776

springboot socket长连接 发送 接收_手把手教你写 Socket 长连接

点击上方“刘望舒”,选择“星标”8点43分打卡 就是真爱本文转载自公众号 玉刚说,由玉刚说写作平台[1]提供写作赞助原作者:水晶虾饺[2]版权声明:本文版权归微信公众号玉刚说所有,未经许可,不得以任何形式转载本篇我们先简单了解一下 TCP/IP,然后通过实现一个 echo 服务器来学习 Java 的 Socket API。最后我们聊聊偏高级一点点的 socket 长连接和协议设计。T...

weixin_39572152的博客 3842

Java实现Modbus通信:从基础到实战

简单介绍ModbusModbus 是一种广泛使用的通信协议,最早在1979年由 Modicon(现为施耐德电气)开发,用于工业自动化设备之间的数据交换。Modbus 是一个开放、简单且灵活的协议,适合工业环境下不同设备和控制系统间的通信。Modbus 协议支持主/从架构,并有两种常见的传输模式:1. Modbus RTU (Remote Terminal Unit):基于串行通信,采用二进制数据格...

fastboot 1036
下一篇: 分享一个比JDK的ThreadPoolExecutor更好用的线程池-JohanThreadPool
moptimus
博客等级 码龄20年 49粉丝 6原创
评论 64
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值