一、区别一帧:
1、加头,比如加头0x7E。
2、加相同头尾,比如0x7E内容0x7E。
可能问题:1、如果丢失下一帧的0x7E和部分内容,会影响到上帧的解析
可能的问题:1、7E中间的内容丢失
2、尾部的内容部分内容和0x7E丢失。不好区分7E是头还是尾
3、7E头和部分内容丢失。不好区分7E是头还是尾
3、加不同头尾,比如0x7E内容0x7F。
不存在以上问题。
二、tcp与udp
发送的区别:
tcp底部有缓冲,一次发生的数据可能有两个帧的内容。
udp可以自己控制,一帧帧发送。
建立链路的区别:
udp没有服务器客户端的概念。
tcpip有
传输时间:
udp不可靠传输速度是tcp的1到2倍(不准确)
三、处理消息的机制:
1、接收的消息:
1、紧急消息,消息优先级
2、短时处理消息,比如设置系统参数。
3、需要处理很长时间的消息。比如传输文件,必须包含传输心跳。//需要单独开个线程处理
2、主动发送的消息:
3、发送失败重传:
4、大文件上传下载:
5、流水号的作用:
6、设备的注册,注销和接收消息处理使用状态机实现:
根据一套协议写处理的程序都有局限性。发展的眼观看问题。
enum
{
LOGIN,
LOGOUT,
HEART_BEAT,
};
int iState = LOGOUT;
int iType = 0;
DWORD dwCurTm = 0;
DWORD dwLastTm = 0;
while(1)
{
iType = pop(/*消息*/)
switch( iType/*收到的协议类型*/ )
{
case 0x01:
{
iState = LOGIN;
}
break;
case 0x02:
{
iState = LOGOUT;
}
break;
}
if( iState == LOGIN )
{
switch(iType /*收到的协议类型*/ )
{
//处理各种短时间命令,长时间命令发送到另外的线程
}
if ( dwCurTm - dwLastTm > 5000 )
{
//发送心跳
}
}
else if( iState == LOGOUT )
{
//发送登入帧
if ( dwCurTm - dwLastTm > 5000 )
{
//重新连接
//如果重新连接成功,发送登入
}
}
}