免费注册 查看新帖 |

Chinaunix

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

非阻塞socket connect [复制链接]

boldeagle 该用户已被删除
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-17 20:27 |只看该作者 |倒序浏览
提示: 作者被禁止或删除 内容自动屏蔽
boldeagle 该用户已被删除
2 [报告]
发表于 2009-06-18 09:16 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2009-06-18 09:39 |只看该作者
没杂懂起你的意思,说明白点阿
boldeagle 该用户已被删除
4 [报告]
发表于 2009-06-18 10:37 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2009-06-18 10:44 |只看该作者

回复 #1 boldeagle 的帖子

getsockopt(sock, SOL_SOCKET, SO_ERROR, &error, &len)

错误尽在error中,O(∩_∩)O~
具体都有些啥错误,俺也不晓得。只晓得少数几个。:wink:

[ 本帖最后由 urapple 于 2009-6-18 10:45 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2009-06-18 11:13 |只看该作者

回复 #1 boldeagle 的帖子

关闭旧的socket, 再用新的socket去connect 不就得了?
还要关心这个错误做什么。

论坛徽章:
0
7 [报告]
发表于 2009-06-18 11:14 |只看该作者
EADDRINUSE? 你可以找个不存在的ip试试看

论坛徽章:
0
8 [报告]
发表于 2009-06-18 11:14 |只看该作者

回复 #5 urapple 的帖子

#define TIMEOUT 3

int _connect( const char* servip)
{
    int fd, retval;
    struct sockaddr_in addr;
    struct timeval timeo = { TIMEOUT,0};
    socklen_t len = sizeof(timeo);
    fd_set set;
    int savefl = 0;

    fd = socket(AF_INET, SOCK_STREAM, 0);
    savefl = fcntl( fd,F_GETFL);
    fcntl( fd, F_SETFL, savefl | O_NONBLOCK);
    bzero( &addr, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = inet_addr(servip);
    addr.sin_port = htons( 1241);

    if( connect(fd, (struct sockaddr*)&addr, sizeof(addr)) == 0)
        goto sjmp;

    if( errno != EINPROGRESS)
    {
        perror("connect: ");
        goto fjmp;
    }

    FD_ZERO( &set);
    FD_SET( fd, &set);
    retval = select( fd + 1, NULL, &set, NULL, &timeo);
    if( retval < 0)
    {
        perror( "select");
        goto fjmp;

    }
    else if( retval == 0)
    {
        fprintf( stderr, "select timeout\n");
        goto fjmp;
    }

    if( FD_ISSET( fd, &set))
    {
        int error = 0;
        socklen_t len = sizeof( error);
        if( getsockopt( fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0)
        {
            fprintf( stderr, "getsockopt fail,connected fail\n");
            goto fjmp;
        }

        if( error == ETIMEDOUT)
        {
            fprintf( stderr, "connecte timeout\n");
            goto fjmp;
        }

        if( error == 0)
            goto sjmp;
        else
        {
            fprintf( stderr, "connect error.\n ");
            goto fjmp;
        }
    }

fjmp:
    close(fd);
    return -1;

sjmp:
    fcntl( fd, F_SETFL, savefl);
    GlobalSocket = fd;
    return fd;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP