Socket上⾃定义协议总结
TCP只是⼀个可靠传输的通信管道,上层协议要你⾃⼰定的,通俗来说就是发送⽅和接收⽅的约定
⾃定义协议的核⼼有两个:
1. 控制码
2. 流程控制
⽤Socket进⾏通信,发送的数据包⼀定是有结构的,类似于:数据头+数据长度+数据内容+校验码+数据尾。
这个你定义⼀个Struct包装起来即可。
控制码是协议的基础信息,主要⽤来解释数据包的基本信息,通信触发的动作等,以便告知收到数据包之后应该如何处理数据包。
例如,你传输⽂件的时候,⼀般会经过“传输开始 - 传输中 - 传输结束”三个阶段,那么Sender针对不同的阶段就要定义不同的命令控制码,以便让Receiver知道传输处于什么过程,这样Receiver收到数据包之后便可以知道下⼀步该做什么。
具体实现上类似于:
switch(iCmdType)
{
case CMD_BEGIN_TRANSFER:
Begin();
break;
case CMD_TRANSFERRING:
Transfer();
break;
case CMD_FINISH_TRANSFER:
Finish();
break;
......
}
⽽流程控制是协议的核⼼所在。以TCP/IP为例,Client和Server如何知道双⽅已经正确建⽴了连接?答案就是“三次握⼿”。三次握⼿就是流程控制。这个就需要对应⽤程序的通信流程把握的⾮常熟悉。
以你的问题为例,“把数据从⼯控机(wince)系统发送到服务器中(xp)中”,XP如何判断已经完整⽽且⽆误地收到了⼀个来⾃于wince的数据包?答案就是靠⾃定义的协议控制码(数据长度)。收到的数据如果是正确的,回应什么给wince?是错误的,⼜该回什么给wince?这就要靠协议所定义的流程控制。
socket只管将数据从⼀个地⽅传递到另外⼀个地⽅,⾄于数据是什么,做什么⽤途的,socket不需要知道。这样的话,你就需要在应⽤层⾃⼰定⼀些协议,⽤来解析你⾃⼰的数据。
socket通信在哪一层例如可以定⼀个协议头
typedef struct Header
{
BYTE protocal; // 协议号
。。。
。。。
}DataHeader, *LPDataHeader;
这样只要你的数据传到了应⽤层,直接取出这个结构体,确定⾥⾯的协议号,就可以知道你的是什么数据了。
以便处理数据!
协议的本质是定义各个实体对象之间的交互规则。
这个你拿到现实之中也是⼀样的,开个玩笑,像什么《中苏XXX同盟友好互助协议》之类的(你认为和Socket有关系吗?哈哈~~~)
我觉得你是卡在怎么实现⼀个协议上了,事实上你只要能编写传统的 C/S 通信程序,那么定义⼀个应⽤层协议真的不是很难的事,只不过差别在于协议定义的⽔平(经验丰富的⼈定义的协议移植性、可靠性
、可扩充性等会好很多,⽽经验不是很丰富的⼈定义出来可能只能在某些机器上Work,在另外⼀些机器上就Bug了...不过这还好,因为⽔平是可以积累提⾼的)
给你个链接:download.csdn/source/2174418
这是我实现的⼀个精简的不能再精简的ftp协议(内⽹传输,⼀对⼀),我甚⾄连什么封包拆包的操作都简化到最低了。你看了就知道定义⼀个协议并不是你想的那么难。当然了,我这个协议定义的很烂,哈哈,因为我写这个程序的⽬的就是替代QQ在内⽹传⼤⽂件的功能(QQ在内⽹传⼏个G的⽂件经常是开始10M/S,很快,但逐渐逐渐的就慢下来,最后⼲脆卡在那不动,这让我们这些经常分享不良资源的童鞋情何以堪啊~~)。够⽤就好,所以没有加太多⽆谓的功能。
我觉得你应该把注意⼒转移到如何让程序Work起来,你⼀边做⼀边想 C 和 S 之间如何才能正确、可靠、⾼效地通信,这样等你把程序写完了,你也基本就知道协议应该怎么定义了。(虽然这样按软件⼯程来看有点本末倒置呵,不过实际就是这样,设计往往是和实现迭代进⾏的)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论