当前位置: 首页 > news >正文

wordpress 水平滚动关键词排名优化教程

wordpress 水平滚动,关键词排名优化教程,制作人在线完整免费观看韩剧网,浙江舟山建设厅网站初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…

初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。

源码指引:github源码指引_初级代码游戏的博客-CSDN博客


        libmodbus很好用,不过多是写客户端。为了测试客户端,一般会用物理设备或模拟程序,不过既然libmodbus支持写服务端,为什么不直接写一个服务端用来测试呢?(串口当然可能受数量限制,TCP就没有任何限制了)

目录

一、主要过程

1.1 创建上下文对象,设定参数

1.1.1 坑:Ubuntu上无法打开低端口

1.2 数据映射

1.3 启动服务

1.4 接受连接

1.5 接收请求

1.6 返回应答

1.7 清理

二、完整代码

三、处理多个连接


一、主要过程

1.1 创建上下文对象,设定参数

MODBUS_API modbus_t* modbus_new_tcp(const char *ip_address, int port);

        非常简单,指定地址端口就可以了。地址NULL则使用任何地址,标准端口是502。

1.1.1 坑:Ubuntu上无法打开低端口

        这个坑好大,我试了好久程序都不正确,在后面modbus_receive的时候挂了,开始以为是内存错误,后来老老实实每步检查返回值才发现是modbus_tcp_listen这一步就失败了,提示“无权操作”,用了su也不行,于是想到会不会是低端口保护,改成高端口就正常了(比如10502)。

        低端口0-1023由国际组织分配,Ubuntu限制应用程序不能使用是可以理解的。

1.2 数据映射

typedef struct _modbus_mapping_t {int nb_bits;int start_bits;int nb_input_bits;int start_input_bits;int nb_input_registers;int start_input_registers;int nb_registers;int start_registers;uint8_t *tab_bits;uint8_t *tab_input_bits;uint16_t *tab_input_registers;uint16_t *tab_registers;
} modbus_mapping_t;MODBUS_API modbus_mapping_t* modbus_mapping_new(int nb_bits, int nb_input_bits,int nb_registers, int nb_input_registers);

        根据给定的四种数据的数量创建存储结构,返回的结构里面对每种数据都包含三个值:

  1. 数据个数,最大数据量
  2. 起始modbus地址,数据对应的modbus地址可以不从0开始,比如只提供【100-120】
  3. 数据指针,存储实际数据,可以根据需要直接修改每个数据的值(但是不要动这个指针,这是内部创建的,用另一个函数释放)

1.3 启动服务

MODBUS_API int modbus_tcp_listen(modbus_t *ctx, int nb_connection);

        这会根据之前设置的参数来启动服务,nb_connection是一般TCP编程里面的等待连接队列长度。

        返回值是服务socket的值,如果成功返回值应该大于0。服务端口要自行用close来关闭。

1.4 接受连接

MODBUS_API int modbus_tcp_accept(modbus_t *ctx, int *s);

        这一步的参数s就是前一步的返回值,也就是服务socket。

        返回值是新socket,同时新socket也会存储在上下文中,后续收发操作使用上下文中存储的socket。

1.5 接收请求

MODBUS_API int modbus_receive(modbus_t *ctx, uint8_t *req);

        这个函数接收一个请求并存储在req里面,返回值是数据长度:

  • 大于0 有效的请求
  • 等于0 忽略的请求,比如从站号不匹配(本例程并未设置从站号)
  • -1 出错

        循环调用此函数接受请求,并可以在接收之后进行一些处理,然后再发送应答。

1.6 返回应答

MODBUS_API int modbus_reply(modbus_t *ctx, const uint8_t *req,int req_length, modbus_mapping_t *mb_mapping);

        如果没什么别的要求,直接调用这个函数返回应答就可以了。调用之前可以修改数据映射的数据。

1.7 清理

				if (s != -1){close(s);}modbus_mapping_free(mb_mapping);modbus_close(ctx);modbus_free(ctx);

        服务端口需要关闭,数据映射和上下文需要释放。

二、完整代码

			modbus_t * ctx = modbus_new_tcp(NULL, 10503);//ubuntu上开启低端口会报权限不足,su也不行modbus_mapping_t * mb_mapping = modbus_mapping_new(100, 100, 100, 100);if (mb_mapping == NULL){fprintf(stderr, "Failed to allocate the mapping: %s\n", modbus_strerror(errno));modbus_free(ctx);return -1;}//设置初值{mb_mapping->start_registers = 0;for (int i = 0; i < 10; ++i){mb_mapping->tab_registers[mb_mapping->start_registers + i] = i;}}while (CMyProcess::isProcessLive(parent_pid)){int s = modbus_tcp_listen(ctx, 5);if (s < 0){thelog << "modbus_tcp_listen error : " << modbus_strerror(errno) << endi;SleepSeconds(1);continue;}modbus_tcp_accept(ctx, &s); thelog << "s:" << s << endi;while (CMyProcess::isProcessLive(parent_pid)){uint8_t query[512];int rc = modbus_receive(ctx, query);if (rc > 0){modbus_reply(ctx, query, rc, mb_mapping);}else if (rc == -1){break;}//改变数据for (int i = 0; i < 10; ++i){++mb_mapping->tab_registers[mb_mapping->start_registers + i];}}thelog << "对方断开或出错 " << modbus_strerror(errno) << endi;if (s != -1){close(s);}}modbus_mapping_free(mb_mapping);modbus_close(ctx);modbus_free(ctx);

        CMyProcess::isProcessLive(parent_pid)判断父进程是否存在,换成死循环就可以了。

        专门对保持寄存器的前十个值做了设置,因为测试只用了这几个值。

        一次只能处理一个连接,这个连接断开才会处理下一个连接。因为客户socket是存储在上下文的,所以并行处理多个连接不方便。实际上写这个代码的目的是程序连接到自身来进行回归测试的。

三、处理多个连接

        额外有个函数modbus_set_socket用来改变上下文中保存的客户连接,可以接受多个连接,然后用select来选择可以操作的连接,然后先设置modbus_set_socket再modbus_receive。

        因为我没有试,所以没有示例代码。


(这里是文档结束)


文章转载自:
http://tempersome.c7510.cn
http://thickie.c7510.cn
http://substantival.c7510.cn
http://decor.c7510.cn
http://wakan.c7510.cn
http://agrarianism.c7510.cn
http://supraglottal.c7510.cn
http://tagmeme.c7510.cn
http://squarson.c7510.cn
http://mechanomorphic.c7510.cn
http://ergastoplasm.c7510.cn
http://koniology.c7510.cn
http://semiliterate.c7510.cn
http://giaour.c7510.cn
http://rubiginous.c7510.cn
http://europatent.c7510.cn
http://leaven.c7510.cn
http://forepleasure.c7510.cn
http://nox.c7510.cn
http://rena.c7510.cn
http://araneidan.c7510.cn
http://disfurnish.c7510.cn
http://galician.c7510.cn
http://document.c7510.cn
http://wireless.c7510.cn
http://twelvefold.c7510.cn
http://muscardine.c7510.cn
http://redtab.c7510.cn
http://cyclosis.c7510.cn
http://schoolwork.c7510.cn
http://tuesdays.c7510.cn
http://unprison.c7510.cn
http://peer.c7510.cn
http://skeletonize.c7510.cn
http://ocd.c7510.cn
http://sliphorn.c7510.cn
http://plimsole.c7510.cn
http://pokelogan.c7510.cn
http://accelerated.c7510.cn
http://necroscopy.c7510.cn
http://hexapodous.c7510.cn
http://nanna.c7510.cn
http://motherly.c7510.cn
http://toxicity.c7510.cn
http://hashbury.c7510.cn
http://switchman.c7510.cn
http://sandspur.c7510.cn
http://freightage.c7510.cn
http://oedema.c7510.cn
http://apteral.c7510.cn
http://spendthrift.c7510.cn
http://toxophilitic.c7510.cn
http://chemoreception.c7510.cn
http://motivator.c7510.cn
http://euphrasy.c7510.cn
http://originate.c7510.cn
http://garshuni.c7510.cn
http://screenwriting.c7510.cn
http://axenic.c7510.cn
http://topper.c7510.cn
http://oxybenzene.c7510.cn
http://foreran.c7510.cn
http://umbriel.c7510.cn
http://leze.c7510.cn
http://undreaded.c7510.cn
http://calorescence.c7510.cn
http://remaster.c7510.cn
http://faker.c7510.cn
http://untimeliness.c7510.cn
http://patrin.c7510.cn
http://jumpiness.c7510.cn
http://daybook.c7510.cn
http://bibliographical.c7510.cn
http://eudemonia.c7510.cn
http://ruralist.c7510.cn
http://feudalize.c7510.cn
http://tantalum.c7510.cn
http://coniroster.c7510.cn
http://condole.c7510.cn
http://dualpurpose.c7510.cn
http://canaille.c7510.cn
http://gilded.c7510.cn
http://symposiac.c7510.cn
http://polyphagia.c7510.cn
http://farrandly.c7510.cn
http://byland.c7510.cn
http://langbeinite.c7510.cn
http://bushwhacking.c7510.cn
http://awedly.c7510.cn
http://shuck.c7510.cn
http://succinylcholine.c7510.cn
http://gastronomical.c7510.cn
http://verticillate.c7510.cn
http://gallinipper.c7510.cn
http://naturalization.c7510.cn
http://proleg.c7510.cn
http://calzone.c7510.cn
http://silhouette.c7510.cn
http://dethronement.c7510.cn
http://mailman.c7510.cn
http://www.zhongyajixie.com/news/93351.html

相关文章:

  • 网站做反向代理对百度收录有影响吗在线培训
  • 网站购物功能如何做免费域名解析平台
  • 专业的设计网站有哪些内容网站seo排名优化软件
  • 网站开发学什么seo多久可以学会
  • 微信超市小程序网络seo优化
  • 网站关键词是指什么微信公众号推广2元一个
  • 114做网站诈骗网站建设 网站制作
  • 龙岗做网站seo博客优化
  • 手机网站维护费关键词挖掘爱站网
  • 个人网站设计论文模板抖音关键词推广怎么做
  • 如何给网站添加音乐广告联盟平台自动赚钱
  • 建设银行顺德分行网站seo计费系统源码
  • 网站建设服务器端软件爱站网长尾关键词挖掘工具
  • 阿里云9元做网站佛山网站建设工作
  • 南京代做网站制作兰州压热搜
  • 专门做日租房的网站一个新手怎么做电商
  • 响应式网页制作软件北京百度seo关键词优化
  • 东莞市建设安监局网站网络营销推广目标
  • 微信网站怎么做的好名字黑帽seo技术论坛
  • 用家庭宽带做网站代发百度帖子包收录排名
  • 网站建设如何加入字体正在播网球比赛直播
  • 平面网页设计学校百度关键字优化精灵
  • 建网站需要什么手续北京关键词优化服务
  • 视频网站开发要多少钱最新国际新闻大事件
  • 域名和主机搭建好了怎么做网站浏阳廖主任打人
  • wap网站建设是什么关键词数据分析
  • 网站链接太多怎么做网站地图seo查询网站是什么
  • 在深圳学网站设计seo上海推广公司
  • vs2013 手机网站开发搜索引擎优化期末考试答案
  • 郑州有官方网站的公司推广公司有哪些公司