我的UDP套接字可能有上百个,如何使用很少的线程就可以对套接字能有效管理?
如果能解决问题,再开两个帖子给200分。
如果能解决问题,再开两个帖子给200分。
解决方案 »
- IOCP是阻塞模型是吧?
- 求高手帮我写一个mfc猴子选大王程序
- 运行delete[]p_Buf;就出错
- 请问SDK中如何画3D边框?
- 关于文件存储方面的东西
- 大家有没有比较好的有关GDI+的电子书啊
- 如何建立基类是CADORecordBinding的类
- OLD的module中的函数在VC中如何调用?
- 小弟刚入门。向大家请教一个问题!!
- ATLCom中的接口参数类型VARIANT如何赋值给BSTR类型的私有变量
- ADO的参数化查询(关键字:ADO 参数化查询 , _ParameterPtr, 单引号 ' )
- <OBJECT ID="MyOcx" CLASSID="CLSID:ED267FGE-CC02-4B8D-A8F8-585FEEFAC487" HEIGHT="220" WIDTH="500">
EVENTSELECT模型一个线程最多支持64个套接字,这个限制会导致需要开辟很多线程。
UDP在EVENTSELECT模型中可以很好工作,但是在完成端口中没有反应,是不是不支持啊?
使用事件选择或是select模型即可满足你的要求
while(Buffer.getLength() >= 0)
if(nret = sendto(socket,Buffer.read,....);
Buffer.remove(nret);
}
注意:UDP你不能确认是否接收到数据。所以也就没有超时重发的问题
老子在后面不是说过了可以只开一个evenselect模型也是可以满足要求的吗。
你说几百个,我信吗!!!
如果同时发送超过8。5k的数据,接收端就会出现问题。
这时就要使用完成端口模型。你他妈知道吗?我自己逐个试的。
while(Buffer.getLength() >= 0)
if(nret = sendto(socket,Buffer.read,....);
{
if(GetLastError() == WSAEWOULDBLOCK)
{
TRACE("Blocking\n");
Sleep(100);
break;
}
else
Buffer.remove(nret);
}
你说的那种方法恐怕不行。
你这样只是保证发送出去,是否送到是不确定的。对方能否返回给你也是不确定的。所以我对每个套接字保存了一个发送缓冲区,时间戳,发送序列号和请求序列号,这样可以解决问题。
仿照的是TCP的实现。
发送缓冲区肯定要有,UDP本来就是不可靠的传输协议。你说的一些时间戳,发送序列号和请求序列号这些也只是从另外一端发回来的握手信息。跟你的问题好像没有关系。
你的问题是“具备超时重发机制”
假如我是你,我会选择TCP/IP方法,而不是UDP方法