MINA服务端与C++客户端通讯(1)

游戏服务端通讯框架实现 从事游戏开发前阵子通过找一些相关资料, 阅读详情

from:http://www.cppblog.com/chugf/archive/2011/07/05/150223.aspx

最近学习了Apache MINA通讯,在使用过程中碰到了一些问题,记录下一些心得。

在服务端和客户端都使用MINA提供的库时,通讯一切正常,当我把客户端改为C++代码时,发现客户端发送给服务端的二进制流中的整形数据,位置被倒置了。

C++客户端16进制  :0x00000013

MINA服务端16进制:0x13000000

查询了网上资料后才知道Java在所有平台上都默认是big-endian,而C++在不同的平台上有不同的字节序, X86上是little-endian, solaris上是big-endian。

注意问题:

1、字节序

C++在不同的平台上有不同的字节序, X86上是little-endian, solaris上是big-endian; 而java在所有平台上都默认是big-endian, 所以在传输诸如short,int,long数据时要在C++转换成网络序(big-endian)
2、字符编码

C++上最普遍的是采用mbcs, 而java上是用unicode(并且和标准的unicode还有些区别,可以参考java文档), 所以除非必须否则不要传字符串, 可以传文本文件代替, 一定要传的话只能自己转换了
3、 内存对齐, 在C/C++的网络通信程序中经常采用读写结构体的方式方便地交换数据, 但是不注意的话结构体内很可能有空隙, 比如struct A{ int a; char c }; struct B{ char a; int b }; 这两个结构体内都有空隙, 而如果不说明空隙的存在java程序是不会知道的, 就会导致双方解析时出错. 要消除空隙应该小心地安排结构体的成员, 不推荐使用#pragma pach(1), 因为没有通用性
4、 位域

除非小心安排, 否则位域导致的结构体大小与平台相关, int a:4所占用的字节随平台和编译器变化(char a:4相对稳定占1字节)
5、 (可能平台相关)传送与接收速度不同
当C++向java传送一个大一些的数据时, 可能C++一边已经传完退出了, 而java那边还没收完, 导致最后的一部分数据丢失. 所以项目中采用了简单的确认机制, 任何一方接收完数据就回送1字节的确认, 以防止C++过早退出

6、(可能平台相关)java在同C++建立连接后以及在C++向java传送完一段数据后, java若向C++传送一段数据则第一次传送的数据C++只能收到一个字节, 第一次过后恢复正常

C++整形转换代码如下:

void swap_4(unsigned long &x)  
{  
    x = (x << 24) |  
    ((x << 8) & 0x00ff0000u) |  
    ((x >> 8) & 0x0000ff00u) |  
    (x >> 24);  
}  
  
int _tmain(int argc, _TCHAR* argv[])  
{  
       
     unsigned long len = 19;  
     swap_4(len);  
}



C++异步网络IO库,仿java的mina实现 前段时间整理一下代码,仿照java的mina自己做了一套C++的异步socket IO 框架。 编译环境: fedora 10 / cenos 5.4 / cygwin gcc version 4.3.2 其他linux环境没试过,不过应该也没啥问题。 使用到的库: 如果光使用socket 只需要 apr-1 库即可, 我用的版本是 0.3.8 代码中集成了 config++ 一个读配置文件的库。 log4cxx log4j 的 C++ 版本,写日志的。 Postgresql开发 使用了 pqxx 库 这是基于 pq库(postgresql 的 c 语言api ) 的c++库 工程 core : 库工程 工程 tools: 例子 motcp socket存储转发功能,可以将通信的包以十六进制的格式打印出来,调试网络程序的好帮手 echoserv echo 服务器,把客户端的数据不更改地返回。 编译,提供两种编译模式,windows的cygwin环境,还有linux环境。不用配置,直接make即可。 先编译core工程,在core工程下直接执行make指令 然后编译tools 工程 , 在工程下直接执行 make 指令 开发环境 eclipse cdt 立即下载

相关推荐

ESP32 Arduino 学习篇(五)TFT_eSPI库

该库有User_Setup.h和 User_Setup_Select.h两个配置文件,支持 ①自定义参数或 ②使用已有配置 驱动TFT屏幕。优点是: 1. 占用空间非常小 2. 动画清晰,充分利用每个像素点 3. 可以非常灵动. 4. 方便进行微调。首先在Libraries里面搜索安装TFT_eSPI库到你的工程文件里面。初始化屏幕, 如果是ST7735,可以往里面传一个参数, 具体用到时再看。缺点是: 1. 容易闪屏 2. 一般不会太复杂 3.需要大量的计算。特别注意: 字库7是仿7段数码屏的样式。

DOF526570的博客 2万+

MINA服务端与C++客户端通讯

最近学习了Apache MINA通讯,在使用过程中碰到了一些问题,记录下一些心得。 在服务端和客户端都使用MINA提供的库时,通讯一切正常,当我把客户端改为C++代码时,发现客户端发送给服务端的二进制流中的整形数据,位置被倒置了。 C++客户端16进制  :0x00000013 MINA服务端16进制:0x13000000 查询了网上资料后才知道Java在所有平台上都默认是big-endi...

weixin_34220623的博客 276

224G PAM-4 通道的 PCB 和封装设计

该行业正在努力实现层厚非常低的 sub-Dk = 3 材料,以及更先进的加工,这将使封装和 PCB 中的透射电镜截止值更高。当回波损耗占主导地位时,我们基本上需要去除沿互连产生阻抗失配的任何元件,就像上面描述的更光滑的铜和更低的 Dk 值一样。第二个影响是传输线阻抗匹配在 56 GHz 范围内的非常高的频率下非常困难的主要原因之一,另一个因素是 Tx 或 Rx 封装/缓冲器中的寄生效应。由于 PCB 和封装中的长度刻度,这是 BGA 上的焊盘、过孔和球等小结构开始在输入阻抗中产生明显偏差的频率范围。

jkh920184196的博客 841

Mina原理及特性(翻译)

Apache Mina是一个能够帮助用户开发高性能和高伸缩性网络应用程序的框架。它通过Javanio技术基于TCP/IP和UDP/IP协议提供了抽象的、事件驱动的、异步的API。 如下的特性: 1、  基于Java nio的TCP/IP和UDP/IP实现 基于RXTX的串口通信(RS232) VM 通道通信 2、通过filter接口实现扩展,类似于Servlet filters

New World 4350

⭐⭐⭐全网最详细YOLOv8教程,从环境配置到自己训练,再到数据集的制作,包的各位⭐⭐⭐

问题原因:当你“pip install ultralytics” 时,torch和torchvision会作为它的依赖一起安装了,当执行“pip install torch torchvision torchaudio --index-url。”时,会卸载torch,然后再安装torch+cuda版本,但是不会自动卸载torchvision已有版本,然后再安装torchvision+cuda版本。🎉🎉🎉恭喜各位道友,已经可以训练模型了,现在就是制作自己的数据集,所谓申神通秘境,随心所欲,万物皆可识别也

weixin_74840239的博客 7492

Rijndael密码算法

一 什么是Rijndael Rijndael是由比利时密码学家设计的分组密码算法,于2000年被选为新一代的标准密码算法——AES。今后会有越来越多的密码软件支持这种算法。 Rijndael的分组长度和密钥长度可以分别以32比特为单位在128比特和256比特的范围内进行选择。不过在AES的规格中,分组长度固定为128比特,密钥长度只有128、192和256比特三种。 二 Rijndael的加...

实践求真知 1万+

MINA服务端与C++客户端通讯(2)

Java与C++通讯还有编码转码的问题存在,假设通讯编码采用UTF-8 C++客户端发送时需要转码成UTF-8编码,接收服务端应答消息后再转回Unicode或者GBK编码 下面给出完成的C++客户端通讯示例: void Transcoding(LPCTSTR src, UINT srcCode, string&amp; dest, UINT destCode)   {     ...

一条鱼 + 一条鱼 200

Python虚拟环境实战:如何在不同conda环境中共享CUDA的libcupti.so.12文件

本文深入探讨了在Python虚拟环境中解决`ImportError: libcupti.so.12`报错的工程化方案。通过分析动态链接库的搜索机制,提供了环境变量法、软链接法和系统级配置法三种解决方案,帮助开发者在不同conda环境中高效共享CUDA动态链接库,确保深度学习项目的顺利运行。

weixin_29094775的博客 239

MINA服务端与C++客户端通讯 1

最近学习了Apache MINA通讯,在使用过程中碰到了一些问题,记录下一些心得。 在服务端和客户端都使用MINA提供的库时,通讯一切正常,当我把客户端改为C++代码时,发现客户端发送给服务端的二进制流中的整形数据,位置被倒置了。 C++客户端16进制  :0x00000013 MINA服务端16进制:0x13000000 查询了网上资料后才知道Java在所有平台上都默认是big-endi

CTO=开发管理+架构+技术专栏 645

损失函数大汇总(五十三)(Boundary Loss附公式推导与代码)

摘要 Boundary Loss是一种针对图像分割任务的新型损失函数,特别适用于高度类别不平衡的细粒度分割场景。与传统的区域型损失(如Dice、交叉熵)不同,它通过计算预测边界与真实边界之间的距离来优化模型,更关注边界精度而非区域重叠。核心思想是利用距离图(distance map)将边界约束转化为区域积分形式,实现端到端训练。具体实现中,损失函数为预测概率与距离图的点积,梯度仅取决于距离图,具有明确的空间引导性。相比区域型损失,Boundary Loss能更好处理小目标、细长结构等边界敏感任务,可与Dic

悦学共鸣,温柔以待,汇聚光芒,共同成长 240

computer planetary——全球生物多样性信息机构 (GBIF)

正如npartitions所表明的,这个Parquet数据集是由许多单独的parquet文件组成的。(GBIF) 是一个由世界各国政府资助的国际网络和数据基础设施,提供记录物种发生的全球数据。重新处理数据的原因有多种,包括主干分类的更改,因此该日期不一定是发生记录最后更改的日期。GBIF 发生数据集结合了来自广泛来源的数据,包括来自自然历史博物馆的标本相关数据、来自公民科学网络的观察和自动环境调查。为了了解最常观察到的物种,我们将对数据集进行分组,并获得每个物种的计数。大多数字段名称对应于。

此星光明博客 1636

mina服务端与c++客户端通信2

原文地址:http://www.cppblog.com/chugf/archive/2011/07/05/150224.html Java与C++通讯还有编码转码的问题存在,假设通讯编码采用UTF-8 C++客户端发送时需要转码成UTF-8编码,接收服务端应答消息后再转回Unicode或者GBK编码 下面给出完成的C++客户端通讯示例: void T...

aikb6223的博客 103

密码学与信息安全面试题及参考答案(2万字长文)

密码学是一门研究信息安全的学科,它涉及加密、解密以及保护数据免受非授权访问的技术和方法。这门学科的核心在于设计并分析各种协议,使通信双方即使在存在潜在敌手的环境中也能安全地传输信息。保密性:确保信息只能被预期的接收方读取,阻止未经授权的第三方获取信息的真实内容。完整性:保证数据在传输过程中不被篡改,确保接收方接收到的信息与发送方发送的信息完全一致。认证性:验证信息的来源,即确认信息确实是由声称的发送方发出的。不可否认性:确保发送方不能在事后否认曾经发送过某条信息。访问控制。

大模型大数据攻城狮的专栏 1994

mina服务端与c++客户端通信1

最近学习了Apache MINA通讯,在使用过程中碰到了一些问题,记录下一些心得。 在服务端和客户端都使用MINA提供的库时,通讯一切正常,当我把客户端改为C++代码时,发现客户端发送给服务端的二进制流中的整形数据,位置被倒置了。 C++客户端16进制 :0x00000013 MINA服务端16进制:0x13000000 查询了网上资料后才知道Jav...

aikb6223的博客 105

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

android 蓝牙通讯demo

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

上一篇: C++程序的父亲母亲:编译器和链接器
下一篇: MINA服务端与C++客户端通讯(2)
Qicz
博客等级 码龄16年 56粉丝 122原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值