- 论坛徽章:
- 0
|
non-blocking connect后getsockopt永远报连接成功,即使是connect一个不存在得ip?
请问这是什么原因?
code:
int
con_to_serv_nonb (char* ip)
{
struct sockaddr_in servaddr;
int newsockfd;
/*create the socket for active opening*/
if((newsockfd=socket(AF_INET,SOCK_STREAM,0))==-1){
printf("error to creat a socket\n");
return 0;
}
printf ("newsockfd: %d\n",newsockfd);
int flags=fcntl(newsockfd,F_GETFL,0);
fcntl(newsockfd,F_SETFL,flags|O_NONBLOCK);
/*assign the address to the active open socket*/
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(21);
inet_pton(AF_INET,ip,&servaddr.sin_addr);
/*connect to the ftp server*/
if(connect(newsockfd,(struct sockaddr*) &servaddr,sizeof(servaddr))==-1){
printf("err: %s\n",strerror(errno));
if(errno!=EINPROGRESS){
printf("error to connect: %s\n",strerror(errno));
memset(recvline,'\0',1000);
close(newsockfd);
return 0;
}
fd_set rset;
fd_set wset;
FD_ZERO(&rset);
FD_ZERO(&wset);
FD_SET(newsockfd,&rset);
FD_SET(newsockfd,&wset);
int maxfd=newsockfd;
struct timeval timeout;
timeout.tv_sec=10;
timeout.tv_usec=0;
select(maxfd+1,&rset,&wset,NULL,&timeout);
int error;
int n=sizeof(error);
int a;
if(FD_ISSET(newsockfd,&rset)||FD_ISSET(newsockfd,&rset)||FD_ISSET(newsockfd,&wset)){
if((a=getsockopt(newsockfd,SOL_SOCKET,SO_ERROR,&error,&n))<0||error!=0){
printf("nonblocking connect failed for %s\n",ip);
close(newsockfd);
return 0;
}
else{
/*就是这里,a总是等于0,error总是success,即使连接得是不存在得IP*/
printf ("connect return \n");
printf ("a: %d\n",a);
printf ("reason: %s\n",strerror(error));
write_result(ip);
close(newsockfd);
return 1;
}
}
/*if the sockft return the EINPROGRESS do nothing*/
printf ("connect no return\n");
close(newsockfd);
return 0;
}
else{
/*而且,有点奇怪得是,即使连接127.0.0.1,connect也不会立即返回*/
printf ("connect return immediately\n");
write_result(ip);
close(newsockfd);
return 1;
}
}/* ----- end of function con_to_serv_nonb ----- */ |
|