我还在考虑这个聊天室的问题,服务器与客户端之间使用tcp连接,客户端与客户端之间直接使用udp传输信息,这里有一些问题我不清楚,请大家帮帮忙。1.服务器端应该用阻塞还是非阻塞的?哪种更好?如果使用多线程,为每个连接建立一个线程可取吗?我怕cpu被废掉!2.udp的包如何解决丢包出错的问题?看到好多人说打包,是指定义传输时的数据结构吗?还有就是怎样在包上打上序号?
请高手多多指点,急切!
请高手多多指点,急切!
解决方案 »
- 关于CDataPathProperty
- vs2003编译报错,其他电脑运行vs2003没问题
- 改变字体后,edit多行显示有问题?
- 初级问题,请问怎么样打开一个图片文件并且生成缩略图?请详细说明一下,特别是GDI+在vs2005的初始化,怎么才能配置好环境?
- TCP传送文件夹,怎么实现阿?各位大虾帮忙
- 练到7级了总算, 散点分庆祝一下随便!
- 请教MFC类型库中的msword下的paragraph类的用法说明
- 在一个TREE中,我想当鼠标划过一个ITEM时,让它显示得与别的不一样?
- 我想对整个工程改名,可以吗
- 关于vc的onpaint()和ondraw()函数
- -欢迎讨论- 内存拷贝怎么样速度最快?
- Win2K下屏蔽Ctrl+Alt+Del的响应(急及)
首先定义一个包头,里面包含你说的序号(在一定时间内不重复),方向(是发出的还是收到的),长度等等,然后每发出一个UDP包都将该包压入队列,而对方收到该包时必须回包,回包采用相同的序号,方向标记置为"回复",发送方收到该回包以后从队列中找出相同序号而方向是"发出"的包并从队列中删除,从而证明一次完整的UDP通讯交互完成。而发送方检测到一个包在发出一定时间后该包仍在队列中,可以判定该次通讯未正常完成,就根据需要决定是否重发。一个典型的UDP包头:
typedef struct
{
DWORD dwSerialID; //包序列号
BYTE byteDire; //方向
BYTE byteFunc; //功能号
DWORD dwLen; //包长度
}另外还可以定义一些时间标识,校验标识等等
2. 包结构可以根据需要自定义,接受方按照定义好的格式解包
回复包数据可以只有1字节表示状态嘛,或者干脆不需要数据,或者利用回复包完成某些功能,当然回复不能进行需要等待的操作,否则对方可能就判断发送超时了。UDP本身就是不可靠的通讯,当然对方收到也完全可能是面目全非的数据包,切片传送传丢了某些片也是有可能的,所以才要加包的数据长度和完整性校验。一个聊天室用的UDP包,限制大小在1K应该能满足需要了吧,大不了就多分几个呗。