我现在的程序,除了三种情况,数据量比较大,其他的都是一些小包。
我以前都是用定长数据包做的。
但是现在好像感觉不太适用。
因为大多数的情况数据量比较小,每次都发那么大的数据,好像浪费资源了。
所以考虑用不定长方式,
这样问题就来了,接收端怎么知道发过来的数据包有多长,
如果接收长度添的长了,那么可能收了两个数据包,
如果短了,可能收到的数据包不完整。
怎么做好呢?
是不是一定要事先发一个包头,来通知对方,然后对方再根据包头中的长度来recv数据?
有没有更好的方法?
我以前都是用定长数据包做的。
但是现在好像感觉不太适用。
因为大多数的情况数据量比较小,每次都发那么大的数据,好像浪费资源了。
所以考虑用不定长方式,
这样问题就来了,接收端怎么知道发过来的数据包有多长,
如果接收长度添的长了,那么可能收了两个数据包,
如果短了,可能收到的数据包不完整。
怎么做好呢?
是不是一定要事先发一个包头,来通知对方,然后对方再根据包头中的长度来recv数据?
有没有更好的方法?
解决方案 »
- 问一个开发工具设置的问题,把VC8 设置成VC6
- UDP socket问题请教。
- 位图知多少 ---- 位图操作大总结
- 想做一个notes那样的状态栏按钮, 按一下弹出列表, 但如何响应整个程序的鼠标事件让他关闭??????????
- 高分求VC中访问ini 文件的代码,
- 如果用最简单的方法重载cout?
- 利用TransmitFile发送文件,接收端recv函数buf长度问题
- 如何改变标题栏的颜色?
- 如果不知道一个窗口的标题,怎样才能得它的handle呢
- 跪求技术支持怎么操控网页元素
- 有一个frame窗口,通过CreateEx生成一个窗口,怎样实现msn那样的效果,即焦点仍然在frame上,但是却是一直浮在上面的?z
- 找团队开发成员(VC、Delphi、ASP.NET、数据库)
typedef struct _PACKAGE_HEAD
{
BYTE m_Version;
WORD m_Command;
WORD m_nDataLen;
}PACKAGE_HEAD;
三种方法:
一、用UDP,UDP协议是分包发送的,其中已有长度字段;
二、自定义包头,包头中有长度字段;
三、自定义一个结束符。这种法子需要把消息内容中含结束符的部分用转义符替换,实现比较困难。
小灵通网关协议(包头(包头+包体长度)(定长)+包体(变长))
DWORD cbMsgSize;
// ... other information ...
};struct MSG1 {
MSGHDR hdr;
// ... body1 information ...
};struct MSG2 {
MSGHDR hdr;
// ... body2 information ...
};