c语言自定义tcp协议实现socket通信

本文介绍了TCP通信中自定义协议的重要性,强调了协议设计的灵活性和双方一致性需求。通过一个C语言的客户端示例展示了如何构造包含起始标志、操作类型、预留位、长度和数据体等字段的协议报文,并讨论了字节序问题。同时,通过netcat模拟服务端接收数据,展示了实际报文在网络中的表现形式,以及可能遇到的数据拆包问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    一般的tcp协议示例,大家给出的demo都是类似一个helloworld的示例,简单罗列了socket建立,创建连接,发送数据,关闭连接的过程,实际上tcp通信确实也就这么多内容。但是,在实际的开发中,我们用tcp通信,肯定不会只是发送一句简单的“你好”。

    实际应用中,我们需要自定义一个协议,也就是protocol,然后与服务端约定网络字节序,最后双方都能根据协议实现数据编码与解码即可。

    自定义协议,没有固定的格式,没有严格的数据类型限制,只要双方都认可就行了。因为通信的双方都需要编解码,不存在只有一方需要编码或者解码,或者说我用协议发数据,你回复数据就用一个"ok"或者200就搞定了,既然是协议,也就是双方都要遵守,tcp是双向通信,两边都需要编解码。

    这里给出一个简单的demo,说明tcp通信如何通过自定义协议来实现。

    自定义协议一般重点在于发送方,因为这是数据源头,所以这里只给出一个client,服务端我用一个netcat的工具来模拟,这里主要看数据的定义,以及最终形成的网络字节序。

    c语言默认采用的是小端序表示的网络字节序。这个会跟解码有关,一般而言,我们数据类型都遵守大端序,尤其是在java语言中,字节序默认就是大端序,这个顺序跟我们的认知是相符合的,也就是高位在前,低位在后,比如0x0001,大端序就表示的是1,这也符合我们的认知习惯,尤其是对于十进制非常熟悉的人来说。

    而小端序恰好相反,比如0x0001,实际上他表示却是0x0100,高位在后,低位在前,不符合我们的认知习惯。

    当然,虽然说大端序,小端序是相反的,但是并不是说我们在表示的时候就是相反的,刚才举的示例都是在转换之后的表现,而且只有数字类型才会表现这种情况,我们通常表示数字都不会直接使用这种十六进制来表示,但是在协议的表示中,为了与位数对齐,会使用0x0001来表示short类型的1。

    定义协议格式如下所示:

字段 数据类型 备注
flag short 标识
version short 版本
type short 类型
reserved short 保留位
length int 数据长度
payload char[]

数据体

checksum char 校验位

 

 

 

    

    

 

 

 

 

    前面说过,协议没有固定的格式,也没有严格的数据类型限制,根据需要定义。但是我是基于以下几点来做的考虑:

    1、协议最好有个明显的起始标志

    2、一般有个操作类型,就是表示这条报文是干什么的,不可能什么东西都在数据体中描述。

    3、报文定义可能为了将来的考虑,设置一个保留位,以免考虑不周,将来需

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luffy5459

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值