如何 自定义应用层协议

Open9i 2011-05-27 10:21:59
现在要使用TCP/IP协议发送一段数据 数据的字段如下

车辆号 司机工号 加油工工号 油枪号 加油量 加油时间

要把数据从工控机(wince)系统 发送到服务器中(xp)中

我准备使用tcp socket 发送 感觉直接发送个结构体就OK了。。

可是老师说要自定义一个应用层通信协议 ,我不知道协议是什么概念,所以更不知道怎么定这个协议。

感觉那些事情TCP不是都已经帮忙做好了么?我们只管发送数据 接收数据不就好了么?

或者
车辆号 司机工号 加油工工号 油枪号 加油量 加油时间
6 6 4 3 5 12 (字节)
这样算不算一个协议?
...全文
1890 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
愤怒的小龙 2013-12-26
  • 打赏
  • 举报
回复
yao050421103 回答很精彩!我想知道 编程用socket实现的话 还要定那么多协议干什么啊。。。不明白。 其实socket只是数据管道,定数据和解析数据它不管!
南浦秋叶 2013-05-05
  • 打赏
  • 举报
回复
我现在也在想这个问题,怎么自定义一个通信协议呢?
Open9i 2011-07-30
  • 打赏
  • 举报
回复
第一次结贴。。不知道分子们给。。。乱给了 不好意思啊。。 我想知道 编程用socket实现的话 还要定那么多协议干什么啊。。。不明白。
cpp_crab 2011-06-07
  • 打赏
  • 举报
回复

关注一下…
xiao_0429 2011-06-02
  • 打赏
  • 举报
回复
呵呵,你的QQ号我找不到了!如果感觉能帮上你,加我QQ吧!314074772
蒙飞鸿 2011-05-31
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 open9i 的回复:]
老师说自定义应用层协议和socket无关。。尴尬。。。。这下彻底不知道怎么搞了。。
[/Quote]
其实你老师这个说法也有瑕疵。。。,不管怎么说,现在你可以不考虑展开太多东西,先从最简单的入手,定义一个结构体(从编程角度看是一个结构体,从协议角度看是一种数据组织形式)来包容数据,这就是一个协议了,如果你老师还有什么说法,下一步再解决吧。
xiao_0429 2011-05-30
  • 打赏
  • 举报
回复
你老师说的是对的啊!应用层协议就该和socket无关啊!
也就是说,socket只管将数据从一个地方传递到另外一个地方,至于数据是什么,做什么用途的,socket不需要知道。这样的话,你就需要在应用层自己定一些协议,用来解析你自己的数据。
例如可以定一个协议头
typedef struct Header
{
BYTE protocal; // 协议号
。。。
。。。
}DataHeader, *LPDataHeader;
这样只要你的数据传到了应用层,直接取出这个结构体,确定里面的协议号,就可以知道你的是什么数据了。
以便处理数据!
不知道说的明白不明白!
yao050421103 2011-05-30
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 open9i 的回复:]
引用 22 楼 mengfeihong 的回复:

引用 11 楼 teleinfor 的回复:
自己定义一个协议非常简单,关键是设计的能够满足要求。
至于什么所谓的程序员创造出来“粘包”这个词语看来给大家的误导不浅,害人。
TCP是stream传输协议,有保障机制确保stream的可靠性。至于货物的识别和处理
需要应用层自己定义和解析。

搞网络编程的人最好能够推TCP/IP协议……
[/Quote]

请注意,如果一个自定义的应用层协议还和socket相关的话,那就不能称呼为“协议”了。
协议是设计上的高层抽象,举个例子,我们用的计算机有可能硬件不同,软件不同,但是只要遵循TCP/IP协议,那么各台计算机之间便可以通信。

协议的本质是定义各个实体对象之间的交互规则

这个你拿到现实之中也是一样的,开个玩笑,像什么《中苏XXX同盟友好互助协议》之类的(你认为和Socket有关系吗?哈哈~~~)

我觉得你是卡在怎么实现一个协议上了,事实上你只要能编写传统的 C/S 通信程序,那么定义一个应用层协议真的不是很难的事,只不过差别在于协议定义的水平(经验丰富的人定义的协议移植性、可靠性、可扩充性等会好很多,而经验不是很丰富的人定义出来可能只能在某些机器上Work,在另外一些机器上就Bug了...不过这还好,因为水平是可以积累提高的)

给你个链接:http://download.csdn.net/source/2174418

这是我实现的一个精简的不能再精简的ftp协议(内网传输,一对一),我甚至连什么封包拆包的操作都简化到最低了。你看了就知道定义一个协议并不是你想的那么难。当然了,我这个协议定义的很烂,哈哈,因为我写这个程序的目的就是替代QQ在内网传大文件的功能(QQ在内网传几个G的文件经常是开始10M/S,很快,但逐渐逐渐的就慢下来,最后干脆卡在那不动,这让我们这些经常分享不良资源的童鞋情何以堪啊~~)。够用就好,所以没有加太多无谓的功能。

我觉得你应该把注意力转移到如何让程序Work起来,你一边做一边想 C 和 S 之间如何才能正确、可靠、高效地通信,这样等你把程序写完了,你也基本就知道协议应该怎么定义了。(虽然这样按软件工程来看有点本末倒置呵,不过实际就是这样,设计往往是和实现迭代进行的)
Open9i 2011-05-29
  • 打赏
  • 举报
回复
老师说自定义应用层协议和socket无关。。尴尬。。。。这下彻底不知道怎么搞了。。
Open9i 2011-05-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 kyotrue 的回复:]

引用 6 楼 open9i 的回复:
如果我如下定义:
1-6字节 车辆号 7-12字节 司机工号 13-16字节 加油工工号 16-19字节 油枪号 19-24字节 加油量 24-36字节 加油时间

这样就可以算是一个协议?


可以,只要你只传这种组织方式的数据
[/Quote]


具体不知道怎么组织数据 尴尬。。。能否举个例子啊 。
Open9i 2011-05-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 mengfeihong 的回复:]

TCP有粘包的问题,你做个协议解决掉,应该就可以完成老师的要求了。
[/Quote]


老师说不考虑粘包的问题。 我就不知道有什么协议好定义的了。。
kyotrue 2011-05-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 open9i 的回复:]
如果我如下定义:
1-6字节 车辆号 7-12字节 司机工号 13-16字节 加油工工号 16-19字节 油枪号 19-24字节 加油量 24-36字节 加油时间

这样就可以算是一个协议?
[/Quote]

可以,只要你只传这种组织方式的数据
蒙飞鸿 2011-05-27
  • 打赏
  • 举报
回复
TCP有粘包的问题,你做个协议解决掉,应该就可以完成老师的要求了。
Open9i 2011-05-27
  • 打赏
  • 举报
回复
如果我如下定义:
1-6字节 车辆号 7-12字节 司机工号 13-16字节 加油工工号 16-19字节 油枪号 19-24字节 加油量 24-36字节 加油时间

这样就可以算是一个协议?
Open9i 2011-05-27
  • 打赏
  • 举报
回复
那我要先把数据转成2进制,再传?然后接收方再把二进制转成字符串么?

socket不是可以直接发送结构体的么?
zyyoung 2011-05-27
  • 打赏
  • 举报
回复
把结构体发过去,就可以当成应用协议了。当然这个协议应该是个模版,可以支持各个协议类型。
Eleven 2011-05-27
  • 打赏
  • 举报
回复
协议就是相互通信的一个规则而已
morebread 2011-05-27
  • 打赏
  • 举报
回复
你老师说的协议应该是这样的:
数据头+数据长度+数据内容+校验码+数据尾

这样规定好以后,不管你想发什么内容都可以按照这个协议来发,另外一方都能正确收到并解析出来。
不然到时你会不知道什么地方才是数据的开始部分,什么地方是数据的结尾
kyotrue 2011-05-27
  • 打赏
  • 举报
回复
TCP只是一个可靠传输的通信管道,上层协议要你自己定的,通俗来说就是发送方和接收方的约定。
你有时候想发6个字节的数据,有时候想发4个字节的数据,没有个协议,接收方怎么知道是按照哪种方式来解析呢?

你说的那个,如果在这个TCP通道上只发送这种数据,接收方每次收6个字节,按照这种固定格式解析,也能算一个协议,只要双方不会产生歧义就行。

一般的来说,要比较通用点的话,传二进制数据一般都采用以下序列:
数据块总长度
数据
蒙飞鸿 2011-05-27
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 open9i 的回复:]
引用 22 楼 mengfeihong 的回复:

引用 11 楼 teleinfor 的回复:
自己定义一个协议非常简单,关键是设计的能够满足要求。
至于什么所谓的程序员创造出来“粘包”这个词语看来给大家的误导不浅,害人。
TCP是stream传输协议,有保障机制确保stream的可靠性。至于货物的识别和处理
需要应用层自己定义和解析。

搞网络编程的人最好能够推TCP/IP协议……
[/Quote]
如果你老师已经说了不考虑粘包,那你在顶楼说的想法已经是一种协议了,如果想复杂点的话,可以考虑一个大数据包,双方怎么协商分成小包传送,如果一方中途中断怎么通知另一方是人为中断的,而不是断网了,这就是协议了。
加载更多回复(13)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧