connect ※ accept 问题!高手进

sharkhuang 2003-11-25 10:56:08
大家都知道accept是block的。我想知道这个2个函数能设置超时值吗?
各种平台都需要!我要封装其为跨平台的。

come on!
...全文
204 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sharkhuang 2003-11-26
  • 打赏
  • 举报
回复
是这样的!服务器端:listen后可以select

客户端:、利用ioctl讲socket设置成非阻塞。
然后select
利用ioctl将socket的设置改回来。
xianjing 2003-11-26
  • 打赏
  • 举报
回复
楼上的time_wait有一定的借鉴,但是没有完全解决作者的意图。

是不是应该是如下步骤:
1、利用ioctl讲socket设置成非阻塞。
2、connect&accept调用。
3、利用select进行选择。
4、利用ioctl将socket的设置改回来。
step_by_step 2003-11-25
  • 打赏
  • 举报
回复
//给你个我写的例子
int TimeWait(int fd, int Mode)
{
fd_set rset;
bool flag = true;
struct timeval timewait;
FD_ZERO(&rset);
FD_SET(fd, &rset);
timewait.tv_sec = SOCK_TIME_OUT;
timewait.tv_usec = 0;

while(flag)
{
if(MODE_WRITE == Mode)
{
if(select(fd+1, NULL, &rset, NULL, &timewait) <= 0)
{
if (errno == EINTR)
{
continue;
}
else
{
return -1;
}
}
}
else if(MODE_READ == Mode)
{
if(select(fd+1, &rset, NULL, NULL, &timewait) <= 0)
{
if (errno == EINTR)
{
continue;
}
else
{
return -1;
}
}
}
else
{
return -1;
}
flag = false;
}
if(!FD_ISSET(fd, &rset))
{
return -1;
}
return 1;
}
step_by_step 2003-11-25
  • 打赏
  • 举报
回复
你可以用select这个函数来为accept实现超时
fierygnu 2003-11-25
  • 打赏
  • 举报
回复
用个定时器信号中断该系统调用。
xujunfeng008 2003-11-25
  • 打赏
  • 举报
回复
可用多线程实现...

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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