免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4603 | 回复: 6
打印 上一主题 下一主题

non-blocking connect后getsockopt永远报连接成功 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-12-11 15:26 |只看该作者 |倒序浏览
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  ----- */

论坛徽章:
0
2 [报告]
发表于 2006-12-11 17:07 |只看该作者
看看UNIX网络编程第一卷第15章,看你的代码和书上代码有什么差别
还有,对函数返回值进行判断

论坛徽章:
0
3 [报告]
发表于 2006-12-11 18:58 |只看该作者
if(FD_ISSET(newsockfd,&rset)||FD_ISSET(newsockfd,&rset)||FD_ISSET(newsockfd,&wset))编辑错来,改成
if(FD_ISSET(newsockfd,&rset)|FD_ISSET(newsockfd,&wset))

select加返回值判断

还有哪里有问题吗?
julianzh 该用户已被删除
4 [报告]
发表于 2006-12-12 11:58 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2006-12-12 18:40 |只看该作者
如果楼上的机器没有装ftp server的话,这样的结果应该是正确的啊,
可我的机器上却总是成功。
我的是gentoo 2006.1

论坛徽章:
0
6 [报告]
发表于 2006-12-13 11:14 |只看该作者
EINPROGRESS 的话, 继续connect

论坛徽章:
0
7 [报告]
发表于 2006-12-13 21:29 |只看该作者
我在一台unbuntu得机子上运行,结果却是一直报错误,郁闷了。到底跟什么有关?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP