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

linux 下 C++ 与三菱PLC 通过MC Qna3E 二进制 协议进行交互

西门子plc 有snap7库 进行交互,并且支持c++ 而且跨平台。但是三菱系列PLC并没有现成的开源项目,没办法只能自己拼接,我这里实现了MC 协议 Qna3E 帧,并使用二进制进行交互。

#pragma once#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <iostream>#include <mutex>
#include <string>
using namespace std;namespace MelsecMC
{class PlcSocket{private:bool is_open;int global_socket_fd; // 用于发送/接受数据mutex m;public:PlcSocket();~PlcSocket();// 初始化socketbool initSocket(string ip, int port, int milSecond);// 关闭socketbool closeSocket();// 发送数据bool write(unsigned char *buffer, int len);// 接收数据bool read(unsigned char *buffer, int len);};
}
#include "socket.h"
#include <chrono>
#include <thread>namespace MelsecMC
{PlcSocket::PlcSocket(){global_socket_fd = -1;}PlcSocket::~PlcSocket(){}bool PlcSocket::initSocket(string ip, int port, int milSecond){// createint socket_fd = socket(AF_INET, SOCK_STREAM, 0);if (socket_fd == -1){cout << "socket 创建失败:" << endl;return false;}struct sockaddr_in addr;addr.sin_family = PF_INET;addr.sin_port = htons(port);addr.sin_addr.s_addr = inet_addr(ip.c_str());// connectint res = connect(socket_fd, (struct sockaddr *)&addr, sizeof(addr));if (res == -1){cout << "connect 链接失败:" << endl;return false;}cout << "connect 链接成功:" << endl;// 设置timeoutsetsockopt(socket_fd, SOL_SOCKET, SO_SNDTIMEO, (char *)20, sizeof(int));setsockopt(socket_fd, SOL_SOCKET, SO_RCVTIMEO, (char *)20, sizeof(int));cout << "setsockopt 成功:" << endl;global_socket_fd = socket_fd;return true;}bool PlcSocket::write(unsigned char *buffer, int len){m.lock();long result = send(global_socket_fd, buffer, len, 0);m.unlock();if (result < 0){return false;}return true;}bool PlcSocket::read(unsigned char *buffer, int len){m.lock();long result = recv(global_socket_fd, buffer, len, 0);m.unlock();if (result < 0){cout << "recv失败:" << endl;return false;}return true;}bool PlcSocket::closeSocket(){close(global_socket_fd);return true;}
}
/***
MC协议的通讯方式有很多种:4C、3C、2C、1C、4E、3E、1E帧格式 数据格式分为二进制格式和ASCII码格式
本代码采用 3E + 二进制格式
https://www.jianshu.com/p/ca7f1609c8c1
***/
#pragma once
#include <sys/sem.h>
#include <sys/shm.h>
#include <iostream>
#include <memory>
#include "socket.h"namespace MelsecMC
{class MelsecMcClient : public std::enable_shared_from_this<MelsecMcClient>{public:using Ptr = std::shared_ptr<MelsecMcClient>;explicit MelsecMcClient();~MelsecMcClient();bool connectTo(const string & ip, int port);bool disconnect();bool readInt32(std::string area,int start,int &value);bool writeInt32(std::string area,int start,int value);bool readShort(std::string area,int start,short &value);bool writeShort(std::string area,int start,short value);private:PlcSocket socket;unsigned char head[7] = {0x50,0x00,0x00,0xFF,0xFF,0x03,0x00};private:unsigned char decodeArea(std::string area);};
}
#include "client.h"
#include <sstream>
#include <iomanip>
namespace MelsecMC
{MelsecMcClient::MelsecMcClient(){}MelsecMcClient::~MelsecMcClient(){disconnect();}bool MelsecMcClient::connectTo(const string &ip, int port){return socket.initSocket(ip, port, 2000);}bool MelsecMcClient::disconnect(){return socket.closeSocket();}bool MelsecMcClient::writeInt32(std::string area,int start,int value){unsigned char cmd[25] = {0};// 头memcpy(cmd, head, 7);//50 00 00 FF FF 03 00   10 00   0A 00   01 14  00 00    64 00 00   A8  02 00  01 00 00 00 写1//请求数据物理长度cmd[7] = 0x10;cmd[8] = 0x00;// CPU监视定时器 表示等待PLC响应的timeout时间cmd[9] = 0x0A;cmd[10] = 0x00;//写命令 跟读的差别是:读是0104,写是0114 ;就是04和14的差别cmd[11] = 0x01;cmd[12] = 0x14;//(子命令) : 值是0表示按字读写入1个字=16位),如果值是1就按位写入cmd[13] = 0x00;cmd[14] = 0x00;//(首地址):地址因为跨度比较大,所以用了3个字节;值640000  返过来是000064,十进制就是100cmd[17] = start / 255 / 255 % 255;cmd[16] = start / 255 % 255;cmd[15] = start % 255;//(软元件 读取的区域) : 表示读取PLC寄存器的类型: 这里的A8表示D点;其他常见的有: 90-M点;9C-X点;9D-Y点;B0-ZR外部存储卡unsigned char areaHex = decodeArea(area);if (areaHex == 0x00){std::cout << "不存在的地址 " << area << std::endl;return false;}cmd[18] = areaHex;//写入长度 00 02  =10进制2个字 =32位 = 4个字节 =1个intcmd[19] = 0x02;cmd[20] = 0x00;//写入int值cmd[24] = (value >> 24) & 0xFF;cmd[23] = (value >> 16) & 0xFF;  cmd[22] = (value >> 8) & 0xFF;cmd[21] = value & 0xFF;if (!socket.write(cmd, sizeof(cmd))){return false;}// 读取数据unsigned char recv[512] = {0};if (!socket.read(recv, sizeof(recv))){return false;}if (recv[0] != 0xD0 && recv[1] != 0x00){std::cout << "数据格式不正确" << std::endl;return false;}return true;}bool MelsecMcClient::readInt32(std::string area, int start, int &value){unsigned char cmd[21] = {0};// 头memcpy(cmd, head, 7);//请求数据长度 也要反过来,值是000C,也就是12;表示后面的报文内容的长度是12cmd[7] = 0x0C;cmd[8] = 0x00;// CPU监视定时器 表示等待PLC响应的timeout时间cmd[9] = 0x0A;cmd[10] = 0x00;// 批量读命令 值是0401(所有值都要反过来看);表示批量读取;如果是1401就是随机写取;cmd[11] = 0x01;cmd[12] = 0x04;//(子命令) : 值是0表示按字读取(1个字=16位),如果值是1就按位读取cmd[13] = 0x00;cmd[14] = 0x00;//(首地址):地址因为跨度比较大,所以用了3个字节;值640000  返过来是000064,十进制就是100cmd[17] = start / 255 / 255 % 255;cmd[16] = start / 255 % 255;cmd[15] = start % 255;//(软元件 读取的区域) : 表示读取PLC寄存器的类型: 这里的A8表示D点;其他常见的有: 90-M点;9C-X点;9D-Y点;B0-ZR外部存储卡unsigned char areaHex = decodeArea(area);if (areaHex == 0x00){std::cout << "不存在的地址 " << area << std::endl;return false;}cmd[18] = areaHex;// 读取长度 00 02  =10进制2个字 =32位 = 4个字节 =1个intcmd[19] = 0x02;cmd[20] = 0x00;// 发送数据if (!socket.write(cmd, sizeof(cmd))){return false;}// 读取数据unsigned char recv[512] = {0};if (!socket.read(recv, sizeof(recv))){return false;}// 解析数据// D0 00 00 FF FF 03 00 06 00 00 00 BB 02 96 49// D0 00 (响应) :表示反馈信息,固定D0 00// 00 (网络编号 ): 与上同// FF (PLC编号) : 与上同// FF 03 (请求目标模块IO编号) : 与上同// 00 (请求目标模块站编号): 与上同// 06 00  应答数据物理长度if (recv[0] != 0xD0 && recv[7] != 0x06){std::cout << "数据格式不正确" << std::endl;return false;}value = recv[14] << 24 | recv[13] << 16 | recv[12] << 8 | recv[11];std::cout << "value " << value << std::endl;return true;}bool MelsecMcClient::readShort(std::string area,int start,short &value){unsigned char cmd[21] = {0};memcpy(cmd, head, 7);cmd[7] = 0x0C;cmd[8] = 0x00;cmd[9] = 0x0A;cmd[10] = 0x00;cmd[11] = 0x01;cmd[12] = 0x04;cmd[13] = 0x00;cmd[14] = 0x00;cmd[17] = start / 255 / 255 % 255;cmd[16] = start / 255 % 255;cmd[15] = start % 255;unsigned char areaHex = decodeArea(area);if (areaHex == 0x00){std::cout << "不存在的地址 " << area << std::endl;return false;}cmd[18] = areaHex;cmd[19] = 0x01;cmd[20] = 0x00;if (!socket.write(cmd, sizeof(cmd))){return false;}unsigned char recv[512] = {0};if (!socket.read(recv, sizeof(recv))){return false;}if (recv[0] != 0xD0 && recv[7] != 0x04){std::cout << "数据格式不正确" << std::endl;return false;}value = recv[12] << 8 | recv[11];std::cout << "value " << value << std::endl;return true;}bool MelsecMcClient::writeShort(std::string area,int start,short value){unsigned char cmd[23] = {0};memcpy(cmd, head, 7);cmd[7] = 0x0E;cmd[8] = 0x00;cmd[9] = 0x0A;cmd[10] = 0x00;cmd[11] = 0x01;cmd[12] = 0x14;cmd[13] = 0x00;cmd[14] = 0x00;cmd[17] = start / 255 / 255 % 255;cmd[16] = start / 255 % 255;cmd[15] = start % 255;unsigned char areaHex = decodeArea(area);if (areaHex == 0x00){std::cout << "不存在的地址 " << area << std::endl;return false;}cmd[18] = areaHex;cmd[19] = 0x01;cmd[20] = 0x00;//写入short值 cmd[22] = (value >> 8) & 0xFF;cmd[21] = value & 0xFF;if (!socket.write(cmd, sizeof(cmd))){return false;}unsigned char recv[512] = {0};if (!socket.read(recv, sizeof(recv))){return false;}if (recv[0] != 0xD0 && recv[1] != 0x00){std::cout << "数据格式不正确" << std::endl;return false;}return true;}unsigned char MelsecMcClient::decodeArea(std::string area){if (area == "D"){return 0xA8;}else if (area == "M"){return 0x90;}else if (area == "X"){return 0x9C;}else if (area == "Y"){return 0x9D;}else if (area == "ZR"){return 0xB0;}else{return 0x00;}}
}
#include "client.h"using namespace MelsecMC;int main(int argc, char **argv)
{MelsecMcClient::Ptr client = std::make_shared<MelsecMcClient>();client->connectTo("10.10.14.60",6000);//int value;//melsecMcNet->readInt32("D",100,value);//client->writeInt32("D",101,122234);//client->writeShort("D",102,223);short value;client->readShort("D",102,value);return 0;
}

可利用 这个工具进行测试:

 协议参考:

https://www.jianshu.com/p/ca7f1609c8c1

相关文章:

linux 下 C++ 与三菱PLC 通过MC Qna3E 二进制 协议进行交互

西门子plc 有snap7库 进行交互&#xff0c;并且支持c 而且跨平台。但是三菱系列PLC并没有现成的开源项目&#xff0c;没办法只能自己拼接&#xff0c;我这里实现了MC 协议 Qna3E 帧&#xff0c;并使用二进制进行交互。 #pragma once#include <stdio.h> #include <std…...

Spring基础(2w字---学习总结版)

目录 一、Spirng概括 1、什么是Spring 2、什么是容器 3、什么是IoC 4、模拟实现IoC 4.1、传统的对象创建开发 5、理解IoC容器 6、DI概括 二、创建Spring项目 1、创建spring项目 2、Bean对象 2.1、创建Bean对象 2.2、存储Bean对象&#xff08;将Bean对象注册到容器…...

07 目标检测-YOLO的基本原理详解

一、YOLO的背景及分类模型 1、YOLO的背景 上图中是手机中的一个app&#xff0c;在任何场景下(工业场景&#xff0c;生活场景等等)都可以试试这个app和这个算法&#xff0c;这个app中间还有一个button&#xff0c;来调节app使用的模型的大小&#xff0c;更大的模型实时性差但精…...

每日一题 78子集(模板)

题目 78 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[],[1],[2]…...

OpenCV之形态学操作

形态学操作包含以下操作&#xff1a; 腐蚀 (Erosion)膨胀 (Dilation)开运算 (Opening)闭运算 (Closing)形态梯度 (Morphological Gradient)顶帽 (Top Hat)黑帽(Black Hat) 其中腐蚀和膨胀操作是最基本的操作&#xff0c;其他操作由这两个操作变换而来。 腐蚀 用一个结构元素…...

设计模式:享元模式

设计模式&#xff1a;享元模式 什么是享元模式 首先我们需要简单了解一下什么是享元模式。享元模式(Flyweight Pattern):主要用于减少创建对象的数量&#xff0c;以减少内存占用和提高性能。享元模式的重点就在这个享字&#xff0c;通过一些共享技术来减少对象的创建&#xff…...

汉诺塔问题(包含了三台柱和四台柱)——C语言版本

目录 1. 什么是汉诺塔 2. 三座台柱的汉诺塔 2.1 思路 2.2 三座台柱的汉诺塔代码 3. 四座台柱的汉诺塔 3.1 思路 3.2 四座台柱的汉诺塔代码 1. 什么是汉诺塔 汉诺塔代码的功能&#xff1a;计算盘子的移动次数&#xff0c;由数学公式知&#xff0c;汉诺塔的盘子移动次数与…...

【实训项目】滴滴电竞APP

1.设计摘要 2013年国家体育总局决定成立一支由17人组成的电子竞技国家队&#xff0c;第四届亚室会中国电竞代表队 出战第四届亚洲室内和武道运动会。 2014年1月13日CCTV5《体育人间》播放英雄联盟皇族战队的纪录片。 在2015到2019年间&#xff0c;我国电竞战队取得的无数值得…...

C++核心编程--类篇

C核心编程 1.内存分区模型 C程序在执行时&#xff0c;将内存大方向分为4个区域 意义&#xff1a;不同区域存放数据&#xff0c;赋予不同的生命周期&#xff0c;更能灵活编程 代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统进行管理的全局区&#xff1a;存放…...

java中用feign远程调用注解FeignClient的时候不重写Encoder和Decoder怎么格式不对呢?

如果在使用 Feign 进行远程调用时&#xff0c;没有重写 Encoder 和 Decoder&#xff0c;但仍然遇到格式不对的问题&#xff0c;可能是由于以下原因之一&#xff1a; 服务端返回的数据格式与客户端期望的格式不匹配&#xff1a;Feign 默认使用基于 Jackson 的 Encoder 和 Decode…...

记录使用Docker Compose 部署《XAPI项目》遇道的问题及解决方案

《XAPI项目》&#xff1a;GitHub仓库&#xff08;勿打&#x1f6ab;小破站一个&#xff09; 这篇文档&#xff0c;主要内容是记录使用Docker Compose 部署《XAPI项目》遇道的问题及解决方案 目录 &#x1f4da; 本地MySQL数据如何导入到容器内的MySQL中❎ 解决报错&#xff1a;…...

腾讯云OCR实践 - 降低客服财务运营成本

一、 前言&#xff1a; 随着图片时代的飞速发展&#xff0c;大量的文字内容为了优化排版和表现效果&#xff0c;都采用了图片的形式发布和存储&#xff0c;这为内容的传播和安全性带来了很大的便利&#xff0c;需要做重复性劳动。 OCR文字扫描工具也逐渐的应运而生&#xff0c;…...

springboot+vue上传图片

这里是一个简单的示例&#xff0c;演示了如何在Spring Boot中从Vue.js上传图像&#xff1a; 1.前端Vue.js代码&#xff1a; <template><div><input type"file" change"handleFileUpload"><button click"uploadImage">…...

高压电缆护层接地环流及温度在线监测系统

高压电缆的金属护层是电缆的重要组成部分&#xff0c;当缆芯通过电流时&#xff0c;会在金属护层上产生环流&#xff0c;外护套的绝缘状态差、接地不良、金属护层接地方式不正确等等都会引起护套环流异常现象&#xff0c;严重威胁电缆运行安全。 当电缆金属护层环流出现异常时…...

无涯教程-JavaScript - IPMT函数

描述 IPMT函数根据定期,固定的还款额和固定的利率返回给定投资期限内的利息支付。 语法 IPMT (rate, per, nper, pv, [fv], [type])争论 Argument描述Required/OptionalRateThe interest rate per period.RequiredPerThe period for which you want to find the interest a…...

【EI会议征稿】第三届机械自动化与电子信息工程国际学术会议(MAEIE 2023)

第三届机械自动化与电子信息工程国际学术会议&#xff08;MAEIE 2023&#xff09; 第三届机械自动化与电子信息工程国际学术会议&#xff08;MAEIE 2023&#xff09;将于2023年12月15-17日在江苏南京举行。本会议通过与业内众多平台、社会各团体协力&#xff0c;聚集机械自动…...

手写实现LRN局部响应归一化算子

1、重写算子的需求 芯片推理过程中遇到很多算子计算结果不对的情况&#xff0c;原因是封装的算子会在某些特殊情况下计算超限&#xff0c;比如输入shape特别大或者数值特别大时&#xff0c;LRN算子计算会出现NAN值&#xff0c;所以需要重写算子。先对输入数据做一个预处理&…...

朗思科技数字员工通过统信桌面操作系统兼容性互认认证

近日&#xff0c;朗思科技数字员工与统信桌面操作系统V20进行了兼容互认&#xff0c;针对上述产品的功能、兼容性方面&#xff0c;通过共同严格测试表明——朗思科技数字员工在统信桌面操作系统 V20上整体运行稳定&#xff0c;满足功能及兼容性测试要求。 北京朗思智能科技有限…...

十六、Webpack常见的插件和模式

一、认识插件Plugin Webpack的另一个核心是Plugin&#xff0c;官方有这样一段对Plugin的描述&#xff1a; While loaders are used to transform certain types of modules, plugins can be leveraged to perform a wider range of tasks like bundle optimization, asset m…...

ChatGPT新增超强插件:文本直接生成视频、海报,支持自定义修改!

全球著名在线设计平台Canva&#xff0c;在ChatGPT Plus&#xff08;GPT-4&#xff09;上推出了插件功能&#xff0c;用户通过文本提示&#xff0c;几秒钟就能生成演示文稿、PPT插图、电子书封面、宴会邀请函等各种精美设计海报&#xff0c;同时支持生成视频。 该插件最强大的功…...

亚像素边缘提取的例子

求帮忙下载&#xff1a; 1.http://download.csdn.net/detail/pkma75/925394 pkma75 资源积分&#xff1a;1分 备注&#xff1a;pdf格式&#xff0c;用曲线拟合的方法计算亚像素&#xff0c;编程易实现&#xff0c;具有较强的实用价值 2.http://download.csdn.net/detail/kua…...

Wayland:推动Linux桌面进入下一代图形显示时代

文章首发地址 Wayland是Linux系统下的一种图形显示协议&#xff0c;旨在替代X Window System&#xff08;X11&#xff09;作为Linux桌面环境的图形显示服务。下面是对Wayland的详细解释&#xff1a; 背景&#xff1a; 传统的Linux桌面环境使用X Window System&#xff08;X11&…...

mysql外键(foreign key)

简介 MySQL的外键约束用来在两个表数据之间建立链接&#xff0c;其中一张表的一个字段被另一张表中对应的字段约束。也就是说&#xff0c;设置外键约束至少要有两种表&#xff0c;被约束的表叫做从表&#xff08;子表&#xff09;&#xff0c;另一张叫做主表&#xff08;父表&…...

内网穿透——Windows搭建服务器

文章目录 1.前言2. Emby网站搭建2.1. Emby下载和安装2.2 Emby网页测试 3. 本地网页发布3.1 注册并安装cpolar内网穿透3.2 Cpolar云端设置3.3 Cpolar内网穿透本地设置 4.公网访问测试5.结语 1.前言 在现代五花八门的网络应用场景中&#xff0c;观看视频绝对是主力应用场景之一&…...

UE5.1 + Android 环境搭建

官方文档&#xff1a;一定一定一定要参照官方文档&#xff0c;因UE不同版本对应的环境搭建并不完全一致。 准备工作 通过EpicGameLaunch下载Android目标平台。 必须安装jdk1.8并配置环境变量&#xff0c;UE5.1不要使用最新的jdk20&#xff1b;下载地址 安装 Android Studio …...

华为python面试题目

华为Python常见的面试问题包括: Python是如何被解释的?什么是PEP8?Python是怎样管理内存的?什么是Python装饰器?Python提供哪些内置类型?Python中的异常处理是怎样的?什么是Python的上下文管理器?Python中的列表推导式是什么?Python中的生成器是什么?什么是Python的装…...

IP代理安全吗?如何防止IP被限制访问?

你是否遇到过可以正常上网&#xff0c;但访问某个网站却被禁止&#xff1f;注册某个网站账号&#xff0c;却被封号&#xff1f;那都是因为IP出现问题&#xff01;您的IP地址透露很多关于您的信息&#xff0c;包括您的位置和互联网活动。 在本文中&#xff0c;我们将一起了解IP地…...

使用 gst-template 创建自己的 gstreamer 插件

系列文章目录 创建 gstreamer 插件的几种方式 使用 gst-template 创建自己的 gstreamer 插件 使用 gst-plugins-bad 里面的 gst-element-maker 工具创建gstreamer 插件 文章目录 系列文章目录前言一、如何获取 gst-template 仓库代码二、gst-template 相关的软件依赖1. 根据自…...

nginx反向代理,用户访问服务器1的80端口,请求转发至服务器2,3的8882端口

两台应用服务器&#xff0c;一台nginx&#xff0c;用户访问nginx服务器80端口&#xff0c;将请求转发至服务器2和服务器3的8882端口。 1、修改nginx配置文件 upstream backend {server 10.60.16.187:8882;server 10.60.16.188:8882;}server {listen 80;server_name 10.6…...

Python学习笔记:导入txt、xlsx文件并做简单函数处理

1.txt文件 1.1路径 file_path "E:\Python Project\temp.txt" with open(file_path) as f:content1 f.read() 导入文件时&#xff0c;如果直接放文件绝对路径上去会报错&#xff0c;这是因为\P是转义字符 所以在绝对路径前面加r可以避免将引号内的内容识别成转义…...

网站做qq链接代码/什么是网络整合营销

之前有一篇写过pycharm远程访问服务器&#xff0c;这里还写vscode的一个类似功能理由有两个。vscode相比于pycharm占用的内存要小。vscode远程访问不要钱&#xff01;&#xff01;&#xff01;而pycharm必须要付费的专业版才拥有这个功能。但是vscode也有不好的地方&#xff0c…...

做电影网站算侵权吗/百度网盘搜索引擎网站

测试环境&#xff1a;ubuntu18.04driver450cuda11.0cudnn8.0.5opencv4.4.0 1、ubuntu显卡驱动下载安装 2、cuda及cudnn安装 3、opencv4编译配置 4、darknet源码编译测试...

wordpress 图片 说明 居中/电子商务网站

本文讲的是记一例“特殊”的运营商流量劫持强弹广告案例诊断&#xff0c;由于没有上HTTPS&#xff0c;国内最大的政府网站疑似遭遇流量劫持&#xff0c;被恶意弹窗涉嫌色情的广告。 一份网上传播的文档截图中记录了整个事件经过。在这份《关于xx院app中h5页面弹出广告的专题会议…...

郑州网站关键词推广/舆情网站直接打开的软件

为什么80%的码农都做不了架构师&#xff1f;>>> 一、准备 下载新版JDK&#xff1a;http://www.oracle.com/technetwork/java/javase/downloads/index.html 所有版本请戳&#xff1a;http://www.oracle.com/technetwork/java/archive-139210.html 二、安装与配置 先…...

苏州网站开发公司电话/网店代运营公司靠谱吗

今天遇到一个问题&#xff1a;pc客户端和android的App通信&#xff0c;心跳通道&#xff08;心跳包27个字节&#xff0c;是一个业务空包&#xff09;在部分pc上总是会超时&#xff08;5秒超时&#xff09;&#xff0c;nagle算法也给禁用了&#xff0c;pc端时按按量发送心跳的&a…...

做时时彩网站要多少钱/杭州seo网站

Xcode最近的那些破事 最近苹果放出了iPhone6s和iOS9&#xff0c;于是我们就得把Xcode更新到7&#xff0c;并且做好iOS9的适配。Xcode更新比较慢&#xff0c;不少人可能会选择去某些网盘或者迅雷的某些源下载&#xff0c;但是最近爆出了新闻&#xff0c;一些非官方渠道下载的Xc…...