请问如何在UDP上实现超时重发?急

dirdir 2001-06-26 09:43:49
我想在UDP上实现一个超时重发机制,但是当客户端接受服务器端的确认时(receivefrom),我得线程会被阻塞,无法响应时间消息,我怎么实现重发??
...全文
390 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
caiyi9000 2001-06-28
  • 打赏
  • 举报
回复
BOOL NotBlock;
int blocksize = sizeof(BOOL);
NotBlock = TRUE;
setsockopt(m_socket, SOL_SOCKET, SO_DONTLINGER, (char*)¬Block, blocksize);
wwwunix 2001-06-26
  • 打赏
  • 举报
回复
用select函数可以让它不阻塞
dirdir 2001-06-26
  • 打赏
  • 举报
回复
请问怎么让它不阻塞哪?我只新手,很多东西我还不知道。请帮忙。
duuyuu 2001-06-26
  • 打赏
  • 举报
回复
这就是你的算法问题了,你为什么要让线程在接到确认时阻塞呢?
flywhc 2001-06-26
  • 打赏
  • 举报
回复
在win下编程,应该用WSAAsyncSelect比较好
int WSAAsyncSelect(
SOCKET s,
HWND hWnd,
unsigned int wMsg,
long lEvent
);
s是你要操作的socket, hwnd是消息处理的窗口
wMsg是自定义的,比如WM_USER+0x100, lEvent是要处理的事件,比如FD_READ/FD_WRITE

在MFC里,用ON_MESSAGE(WM_USER+0x100,OnSocketEvent)映射,SDK就不用说啦。

当有数据到达时会收到这个消息,你就在OnsockeEvent里判断,如果是FD_READ就receivefrom

setsockopt一般是取消阻塞方式时才用。

unix下用select,实际是放到一个死循环里反复查询哪个socket有数据到达...

去阅读MSDN window socket部分吧。能用到的就这几个函数
dirdir 2001-06-26
  • 打赏
  • 举报
回复
请问如何用setsockopt设置成非阻塞方式
caiyi9000 2001-06-26
  • 打赏
  • 举报
回复
sokcet有阻塞和非阻塞两种模式。
阻塞socket指对此socket进行操作函数调用时,如receivefrom(),将处于阻塞状态,一直等到调用成功才返回。
非阻塞socket的操作则马上返回。
编程序时,创建的socket默认都是阻塞模式,所以根据需要你要自己将它设置为非阻塞模式。当然如果你用MFC提供的CAsyncSocket类,那么你就无须自己设置非阻塞模式了,因为此类已经封装好了非阻塞模式。
caiyi9000 2001-06-26
  • 打赏
  • 举报
回复
建议你用非阻塞socket,在Windwos下可以用setsockopt()将socket设置为非阻塞模式,也可以直接调用WSAAsyncSelect()异步事件注册函数给socket注册异步事件,此操作自动把socket设置为非阻塞模式。这样你在此socket上调用receivefrom或sendto等操作函数时,就不会使线程被阻塞了。
在UNIX下也可以用setsockopt()或select()进行设置。

4,354

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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