- 论坛徽章:
- 0
|
对于一个 sk=socket(AF_INET, SOCK_STREAM, 0) 套接字
设为非阻塞后,调用 connect() 开始连接,然后按照 man 2 connect 中 EINPROGRESS 段所说明的进行处理。
我的IP地址为:192.168.1.22,通过默认网关192.168.1.1访问其它子网192.168.2.X及外网。
现在的问题是:如果我把默认网关删掉 route del default ,当我用socket来connect 192.168.2.X中的一个主机时,SO_ERROR读回的仍然是0,表明连接成功。后面的代码判断连接成功,随后就写这个socket,然后SIGPIPE。
简单的忽略SIGPIPE似乎也能解决问题,但不知道会不会有什么问题?请问还有没有其它的解决方法?
if (connect(sk, (struct sockaddr *)sin, sizeof(struct sockaddr)) == -1)
{
tv.tv_sec = 2;
tv.tv_usec = 0;
FD_ZERO(&writefds);
FD_SET(sk, &writefds);
if(select(sk+1, NULL, &writefds, NULL, &tv) != 0)
{
if(FD_ISSET(sk, &writefds))
{
len=sizeof(error);
if(getsockopt(sk, SOL_SOCKET, SO_ERROR,(char *)&error, &len) < 0)
return -1;
if(error != 0)
return -1;
}
else
return -1;
}
else
return -1 ;
}
|
|
|