`
raojl
  • 浏览: 203256 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

linux 下建立异步链接

 
阅读更多
int32_t SockEndPoint::connect_server()
{
	struct sockaddr_in client_addr;
    int sock_ret = 0;
    bzero(&client_addr, sizeof(client_addr) );
    client_addr.sin_family = AF_INET;
    client_addr.sin_addr.s_addr = htons(INADDR_ANY);
    client_addr.sin_port = htons(0);    

    client_socket_ = socket( AF_INET, SOCK_STREAM, 0);
    if ( client_socket_ < 0)
    {
        LOGV(LL_ERROR, "Create Socket Failed!\n" );
        return -1;
    }
    /*
    if ( bind( client_socket_ , (struct sockaddr*)&client_addr, sizeof(client_addr)))
    {
        LOGV(LL_ERROR, "Client Bind Port Failed!\n" ); 
        return -2;
    }*/
    struct sockaddr_in server_addr;
    bzero(&server_addr, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    if (inet_aton(addr_.c_str() , &server_addr.sin_addr) == 0)
    {
        LOGV(LL_ERROR, "Server IP Address Error!\n" );
        return -3;
    }

    int flags = 0,error = 0;
    socklen_t len;
    flags = fcntl( client_socket_, F_GETFL, 0);
    fcntl(client_socket_, F_SETFL, flags | O_NONBLOCK);
	
    server_addr.sin_port = htons( port_ );
    socklen_t server_addr_length = sizeof(server_addr);
 
    if ( (sock_ret = connect(client_socket_, (struct sockaddr*)&server_addr, server_addr_length)) < 0)
    {
        if ( errno != EINPROGRESS )
            return -1;
    }
    if( sock_ret == 0 )
    {
        LOGV(LL_INFO, "local connect To %s:%d ok!\n", addr_.c_str() , port_ );
    }

    FD_ZERO(&rdfds);
    FD_SET( client_socket_ , &rdfds);
    wdfds = rdfds;
    struct timeval tv;
    tv.tv_sec = 5;
    tv.tv_usec = 0;

    sock_ret = select( client_socket_ + 1, &rdfds, &wdfds , NULL, &tv);
    if ( sock_ret <= 0 )
    {
        LOGV(LL_ERROR, "select error  or timeout !");
        close(client_socket_);
        return -1;
    }
    if (/* FD_ISSET(client_socket_, &rdfds) ||*/ FD_ISSET(client_socket_, &wdfds) )
    {
        if ( FD_ISSET(client_socket_, &rdfds) )
        {
            LOGV(LL_ERROR, "socket refuse !");
            close(client_socket_);
            return -1;
        }
        if ( getsockopt(client_socket_, SOL_SOCKET, SO_ERROR, &error, &len) != 0)
        {
            if ( error )
            {
                LOGV(LL_ERROR, "Can not connect To %s:%d refuse,error %d msg %s !\n", 
                     addr_.c_str() , port_, error, strerror(error) );
                return -4;
            }
        }
        else 
        {
            LOGV(LL_INFO, "connect To %s:%d ok!\n", addr_.c_str() , port_ );
            connect_status_ = 1;
        }
    }else
    {
        LOGV(LL_ERROR, "Can not connect To %s:%d timeout!\n", addr_.c_str() , port_ );
        close(client_socket_);
        return -1;
    }

    printf("trace %d %d\n", client_socket_, sock_ret );
    fcntl(client_socket_, F_SETFL, flags);
 
    return 0;
}

 

分享到:
评论

相关推荐

    linux网络编程-宋敬彬-part1

    4.4.2 Linux下线程创建函数pthread_create() 129 4.4.3 线程的结束函数pthread_join()和pthread_exit() 129 4.4.4 线程的属性 130 4.4.5 线程间的互斥 132 4.4.6 线程中使用信号量 133 4.5 小结 136 第2...

    [14本经典Android开发教程]-8-Linux内核阅读心得体会

    读核感悟 Linux内核启动 链接脚本 11 读核感悟 伪装现场 系统调用参数 13 读核感悟 伪装现场 fork 系统调用 15 读核感悟 伪装现场 内核线程: 17 读核感悟 伪装现场 信号通信 19 读核感悟 kbuild系统 内核模块的编译...

    Linux内核阅读

    读核感悟-Linux内核启动-链接脚本............................................11 读核感悟-伪装现场-系统调用参数.............................................13 读核感悟-伪装现场-fork()系统调用...............

    Linux多线程服务端编程:使用muduo C++网络库

    《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。...

    NetCoreServer:超快速和低延迟异步套接字服务器和客户端C#.NET Core库,支持TCP,SSL,UDP,HTTP,HTTPS,WebSocket协议和10K连接问题解决方案

    内容产品特点跨平台(Linux,OSX,Windows) 异步通讯支持的传输协议: , , , 支持的Web协议: , , , 支持的迭代文档要求Linux OSX Windows 10可选的:如何建造?设置库git clone ...

    SwiftCoroutine:适用于iOS,macOS和Linux的Swift协程

    与回调类似,您还需要创建链接调用,这就是为什么您通常不能使用循环,异常处理等的原因。 通常,您需要学习具有数百种方法的复杂的新API。 无需使用实际数据,而是需要始终使用一些包装器。 错误链接的处理起来...

    疯狂内核之——虚拟文件系统

    目录 1 虚拟文件系统概述 5 1.1 通用文件模型 7 1.2 VFS所处理的系统调用 9 2 虚拟文件系统架构 11 2.1 VFS对象数据结构 11 ...6.2.1 Linux 2.6中的异步I/O 394 6.2.2 异步I/O环境 394 6.2.3 提交异步I/O操作 395

    dart-async-sqlite:用于异步访问 SQLite 的 Dart 原生库

    Dart异步sqlite 用于异步访问 SQLite 的 Dart 原生库。 特征: 异步 dart SQLite 访问 ...pub upgrade——为dart导入创建包目录和链接 dart example/test.dart -- 运行示例程序创建 /tmp/test.sqlite

    linux网路编程 中文 23M 版

    2.1 Linux环境下的编辑器................................................. 14 2.1.1 v i m使用简介...................................................14 2 . 1 . 2使用v i m建立文件............................

    队列器:队列器是一个队列管理器,建立在OperationQueue和Dispatch(aka GCD)之上

    它使您可以轻松地创建任何异步和同步任务,全部由一个队列管理,只需几行。 这是所有功能的列表: 可在所有Swift兼容平台(甚至Linux)上运行 易于使用 有据可查(100%有据可查) 经过良好测试(100%的代码...

    NTKO文档在线编辑控件4.0.1.2

    这为C/S结构下创建共享的办公系统,文档管理,知识管理解决方案提供了更强大的接口。 8 状态栏,智能Web调用,预定义模板套红 全面支持状态栏,用户界面更加友好。智能Web调用让您甚至可使用XML或者自定义的协议与...

    rclone-browser-1.8.0-a0b66c6-macos.dmg kapitainsky-rclone-browser: 1.8.0,a0b66c6

    包括加密的rclone使用与rclone相同的配置文件,不需要额外的配置支持rclone.conf配置文件的自定义位置和加密同时在单独的选项卡中导航多个存储库列出文件的名称,大小和层次结构修改日期所有rclone命令都是异步执行...

    一个进程池的服务器程序

    1,父进程listen,创建pipe(下面所有父子进程之间的通信都用该pipe) 2,父进程预fork n个子进程 3,各个子进程accept(listenfd),即所有子进程竞争accept请求。由于listenfd是在fork之前就有的,所以所有子进程都...

    OraExp:跨平台、原生、异步、免费的 Oracle IDE-开源

    以下是当前支持的功能列表: - 完整的 unicode 支持 - 以下对象类型的创建者/编辑器/查看器:关系表、视图、包、过程、函数、触发器、序列、类型、同义词、数据库链接、用户 - 支持工作表用于绑定参数(包括游标)...

    New of GWT Introduction--GWT开发快速入门

    这种情况下,我们就可以既充分利用Java语言的开发优势降低Ajax应用开发的难度,加快Ajax应用的开发速度,为Ajax的大规模应用创造可能,又可以充分发挥Ajax技术的优势,创建更加动态和交互性更好的Web应用程序,提升...

    netty4.0.27Learn:该项目是为了学习netty4.0的源码而创建的-项目

    该项目是为了学习netty4.0的源码而创建的。 净额项目 Netty是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。 链接 如何建造 有关构建和开发Netty的详细信息,请访问。 该页面...

    Java资源包01

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    百度地图毕业设计源码-CrawlerProject:爬虫项目:链家网(普通/scrapy)、虎扑、维基百科、百度地图api、房天下(分布式爬虫

    百度地图毕业设计源码 CrawlerProject NOTE: 开发环境:Win10(WSL-Ubuntu、VMWare-Ubuntu Server 18.04) + Anaconda3 + PyCharm(VSCode) ...Insider版本实现win10下远程连接WSL编写...异步爬取:(asyncio+aiohttp+xpat

    高级UNIX编程 pdf 电子书

    3.3 硬链接和符号链接 3.4 路径名 3.5 访问和显示文件元数据 3.6 目录 3.7 改变信息节点 3.8 其他的文件处理调用 3.9 异步I/O 练习 第4章 终端I/0 4.1 概述 4.2 从终端读取数据 4.3 会话和进程组(作业) 4.4 ioctl...

    UNIX环境高级编程_第二版中文

    4.16 符号链接  4.17 symlink和readlink函数  4.18 文件的时间  4.19 utime函数  4.20 mkdir和rmdir函数  4.21 读目录  4.22 chdir、fchdir和getcwd函数  4.23 设备特殊文件  4.24 文件访问权限位...

Global site tag (gtag.js) - Google Analytics