博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Socket上自定义协议总结
阅读量:5806 次
发布时间:2019-06-18

本文共 1675 字,大约阅读时间需要 5 分钟。

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不需要知道。这样的话,你就需要在应用层自己定一些协议,用来解析你自己的数据。

例如可以定一个协议头
typedef struct Header
{
   BYTE protocal;   // 协议号
   。。。
   。。。
}DataHeader, *LPDataHeader;
这样只要你的数据传到了应用层,直接取出这个结构体,确定里面的协议号,就可以知道你的是什么数据了。
以便处理数据!

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

这个你拿到现实之中也是一样的,开个玩笑,像什么《中苏XXX同盟友好互助协议》之类的(你认为和Socket有关系吗?哈哈~~~)
我觉得你是卡在怎么实现一个协议上了,事实上你只要能编写传统的 C/S 通信程序,那么定义一个应用层协议真的不是很难的事,只不过差别在于协议定义的水平(经验丰富的人定义的协议移植性、可靠性、可扩充性等会好很多,而经验不是很丰富的人定义出来可能只能在某些机器上Work,在另外一些机器上就Bug了...不过这还好,因为水平是可以积累提高的)
给你个链接:http://download.csdn.net/source/2174418
这是我实现的一个精简的不能再精简的ftp协议(内网传输,一对一),我甚至连什么封包拆包的操作都简化到最低了。你看了就知道定义一个协议并不是你想的那么难。当然了,我这个协议定义的很烂,哈哈,因为我写这个程序的目的就是替代QQ在内网传大文件的功能(QQ在内网传几个G的文件经常是开始10M/S,很快,但逐渐逐渐的就慢下来,最后干脆卡在那不动,这让我们这些经常分享不良资源的童鞋情何以堪啊~~)。够用就好,所以没有加太多无谓的功能。
我觉得你应该把注意力转移到如何让程序Work起来,你一边做一边想 C 和 S 之间如何才能正确、可靠、高效地通信,这样等你把程序写完了,你也基本就知道协议应该怎么定义了。(虽然这样按软件工程来看有点本末倒置呵,不过实际就是这样,设计往往是和实现迭代进行的)

转载于:https://www.cnblogs.com/bigbear1385/p/5016083.html

你可能感兴趣的文章
AIX 安装 RAC 无法发现节点(后遗症。。。)
查看>>
搭建网站必不可少的知识15
查看>>
HDOJ-2039 三角形
查看>>
图像处理之高斯混合模型
查看>>
安装docker及配置Android开发环境
查看>>
F5-BIG-3400实现负载均衡1
查看>>
【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验十九:SDRAM模块② — 多字读写...
查看>>
12.Azure应用程序网关(下)
查看>>
实验12 ICMP 协议程序设计
查看>>
积少成多Flash(4) - ActionScript 3.0 实例之Hello World, 时钟, 计时器
查看>>
SCOM 2012系列④客户端代理安装
查看>>
PHP缓存技术:memcache函数详解之三
查看>>
AWS - 通过Snapshot 还原 EC2实例的一些问题
查看>>
类型转换是的数据丢失问题
查看>>
mfs on ubuntu
查看>>
datetime.date
查看>>
快速构建Windows 8风格应用17-布局控件
查看>>
快速构建Windows 8风格应用21-构建简单媒体播放器
查看>>
详细的bootloader的移植(6)
查看>>
Oracle中空值与数字相加问题
查看>>