1.将打开的socket设为非阻塞的,可以用fcntl(socket, F_SETFL,O_NDELAY)完
成(有的系统用FNEDLAY也可).
2.发connect调用,这时返回-1,但是errno被设为EINPROGRESS,意即connect仍旧
在进行还没有完成.
3.将打开的socket设进被监视的可写(注意不是可读)文件集合用select进行监视,
如果可写,用
getsockopt(socket, SOL_SOCKET, SO_ERROR,&error, sizeof(int));
来得到error的值,如果为零,则connect成功.
代码如下:
ret = connect (sockfd, &addr, sizeof(addr));
if (ret == 0)
break;
if (ret < 0 && errno == EINPROGRESS)
{
FD_ZERO(&fset);
FD_SET(sockfd,&fset);
if ((ret = select(sockfd + 1, NULL, &fset, NULL, &to)) > 0)
{
if (FD_ISSET(sockfd, &fset) > 0)
{
if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, (char *)&error, &error_len) < 0)
error = 1;
}
}
if (error == 0)
break;
}
代码如下:
ret = connect (sockfd, &addr, sizeof(addr));
if (ret == 0)
break;
if (ret < 0 && errno == EINPROGRESS)
{
FD_ZERO(&fset);
FD_SET(sockfd,&fset);
if ((ret = select(sockfd + 1, NULL, &fset, NULL, &to)) > 0)
{
if (FD_ISSET(sockfd, &fset) > 0)
{
if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, (char *)&error, &error_len) < 0)
error = 1;
}
}
if (error == 0)
break;
}