紧急求助!关于客户端管理多UDP套接字,采用什么模型可以具备超时重发机制?

softrain 2005-04-27 10:01:11
我的UDP套接字可能有上百个,如何使用很少的线程就可以对套接字能有效管理?
如果能解决问题,再开两个帖子给200分。
...全文
215 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
softrain 2005-04-28
  • 打赏
  • 举报
回复
刚才写了很多,提交时server unavailable.经常这样,我看CSDN的服务器支撑不下去。

ddgfei(不懂规矩) :
你说的那种方法恐怕不行。
你这样只是保证发送出去,是否送到是不确定的。对方能否返回给你也是不确定的。

所以我对每个套接字保存了一个发送缓冲区,时间戳,发送序列号和请求序列号,这样可以解决问题。
仿照的是TCP的实现。
ddgfei 2005-04-28
  • 打赏
  • 举报
回复
更确切的说要想实现超时重发只有在缓冲区中来写了
while(Buffer.getLength() >= 0)
if(nret = sendto(socket,Buffer.read,....);
{
if(GetLastError() == WSAEWOULDBLOCK)
{
TRACE("Blocking\n");
Sleep(100);
break;
}
else
Buffer.remove(nret);
}
mango279 2005-04-28
  • 打赏
  • 举报
回复
UDP能实现无条件NAT透传??请教: softrain(敢笑杨过不痴情)
softrain 2005-04-28
  • 打赏
  • 举报
回复
TCP无法实现NAT传透

我说的超时重发机制是说在一个套接字超过某个时间没有收到消息,系统应该能通知到我。这样我可以重新发送数据。否则UDP通讯无法进行下去了。
ddgfei 2005-04-28
  • 打赏
  • 举报
回复
而且你这样实现的话还不如去使用TCP/IP方法,何必要使用UDP呢,难道你认为你写的代码会比Windows那帮家伙更厉害。UDP本身是用于不可靠,无连接的方法。
假如我是你,我会选择TCP/IP方法,而不是UDP方法
ddgfei 2005-04-28
  • 打赏
  • 举报
回复
什么意思?
发送缓冲区肯定要有,UDP本来就是不可靠的传输协议。你说的一些时间戳,发送序列号和请求序列号这些也只是从另外一端发回来的握手信息。跟你的问题好像没有关系。
你的问题是“具备超时重发机制”
ddgfei 2005-04-27
  • 打赏
  • 举报
回复
leon7909(leon) 你大爷。
老子在后面不是说过了可以只开一个evenselect模型也是可以满足要求的吗。
你说几百个,我信吗!!!
如果同时发送超过8。5k的数据,接收端就会出现问题。
这时就要使用完成端口模型。你他妈知道吗?我自己逐个试的。
ddgfei 2005-04-27
  • 打赏
  • 举报
回复
不是不支持,我实现了事件模型,也实现了完成端口模型的封装,发现它和事件模型没什么区别,因为是数据报。所以发送的数据可以全部收到。你可以在发送端写一个缓冲区,如下
while(Buffer.getLength() >= 0)
if(nret = sendto(socket,Buffer.read,....);
Buffer.remove(nret);
}
注意:UDP你不能确认是否接收到数据。所以也就没有超时重发的问题
nuaawenlin 2005-04-27
  • 打赏
  • 举报
回复
UDP的没有重传机制,只能由应用层来解决

如果数据交换不是非常频繁的话
使用事件选择或是select模型即可满足你的要求
leon7909 2005-04-27
  • 打赏
  • 举报
回复
The variable FD_SETSIZE determines the maximum number of descriptors in a set. (The default value of FD_SETSIZE is 64, which can be modified by defining FD_SETSIZE to another value before including Winsock2.h.)
softrain 2005-04-27
  • 打赏
  • 举报
回复
超时重发我已经决定了字节写。
EVENTSELECT模型一个线程最多支持64个套接字,这个限制会导致需要开辟很多线程。
UDP在EVENTSELECT模型中可以很好工作,但是在完成端口中没有反应,是不是不支持啊?
leon7909 2005-04-27
  • 打赏
  • 举报
回复
开口闭口就是完成端口,几百个连接用select就能工作得挺好,不过不管是哪个模型也不能具备你所说的udt超时重发机制,这个是要自已写的.要么干脆就用tcp
ddgfei 2005-04-27
  • 打赏
  • 举报
回复
IO完成端口模型,或者你只开一个线程,使用evenselect模型也是可以的,不管你有多少个套接字

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧