您的位置:首页 > 其它

connet()超时连接的一般方

2008-10-19 13:34 85 查看

connet()超时连接的一般方

原文地址:http://www.linuxdiyf.com/bbs/viewthread.php?tid=111439&pid=562826&page=1&extra=page%3D#pid562826

LINUX下的方法:

在阻塞套接字的一般情况下,connect ()直到客户端对SYN消息的ACK消息到达之前才会返回。使connect()调用具有超时机制的一个方法是让套接字成为非阻塞的套接字体,然后用select()来等待它完成。复制内容到剪贴板代码:
s = socket(AF_INET, SOCK_STREAM, 0);

//下面获取套接字的标志

if ((flags = fcntl(s, F_GETFL, 0)) < 0)

{

//错误处理

}

//下面设置套接字为非阻塞

if (fcntl(s, F_SETFL, flags | O_NONBLOCK) < 0)

{

//错误处理

}

if ((retcode = connect(s, (struct sockaddr*)&peer, sizeof(peer)) &&   errno != EINPROGRESS))

{

//因为套接字设为NONBLOCK,通常情况下,连接在connect()返回

//之前是不会建立的,因此它会返回EINPROGRESS错误,如果返回

//任何其他错误,则要进行错误处理

}

if (0 == retcode)

{  //如果connect()返回0则连接已建立

//下面恢复套接字阻塞状态

if (fcntl(s, F_SETFL, flags) < 0)

{

//错误处理

}

//下面是连接成功后要执行的代码

exit(0)

}

FD_ZERO(&rdevents);

FD_SET(s, &rdevents);  //把先前的套接字加到读集合里面

wrevents = rdevents;   //写集合

exevents = rdevents;   //异常集合

tv.tv_sec = 5;  //设置时间为5秒

tv_tv_usec = 0;

retcode = select(s+1, &rdevents, &wrevents, &exevents, &tv);

if (retcode < 0)

{  //select返回错误???

//错误处理

}

else if (0 == retcode)

{  //select 超时???

//超时处理

}

esle

{

//套接字已经准备好

if (!FD_ISSET(s, &rdevents) && !FD_ISSET(s, &wrevents))

{

//connect()失败,进行错处理

}

if (getsockopt(s, SOL_SOCKET, SO_ERROR, &err, &len) < 0)

{

//getsockopt()失败,进行错处理

}

if (err != 0)

{

//connect()失败,进行错处理

}

//到这里说明connect()正确返回

//下面恢复套接字阻塞状态

if (fcntl(s, F_SETFL, flags) < 0)

{

//错误处理

}

//下面是连接成功后要执行的代码

exit(0)

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: