`
raojl
  • 浏览: 208399 次
  • 性别: 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;
}

 

分享到:
评论

相关推荐

    libvlc-qt-0.8.0 linux下vlc qt开发链接库

    《Linux环境下基于Qt的VLC开发链接库libvlc-qt-0.8.0详解》 在Linux操作系统中,多媒体播放器VLC以其强大的解码能力和跨平台特性深受开发者喜爱。而libvlc-qt库是VLC与Qt框架集成的重要桥梁,它允许开发者在Qt应用...

    Linux驱动开发——异步通知驱动程序

    在Linux驱动开发中,创建一个异步通知驱动程序通常包括以下几个关键步骤: 1. **注册中断处理程序**:驱动程序需要注册一个中断处理函数,这个函数会在硬件设备触发中断时被调用。这通常通过`request_irq()`函数...

    Linux高级程序设计

    它涵盖了Linux环境下的高级程序设计技术,包括系统调用、进程管理、内存管理、文件系统、网络编程以及多线程等内容。这些知识点是Linux程序员必备的基础,对于提升软件开发的效率和质量至关重要。 首先,Linux系统...

    Linux qt 下 使用libusb进行通信

    在Linux环境下,Qt是一个强大的跨平台应用程序开发框架,它提供了丰富的图形用户界面工具包和网络编程接口。同时,libusb是一个开源库,用于与USB设备进行底层通信,它允许程序员直接控制USB设备,而无需依赖操作...

    Linux下的C-C++编程

    5. **编译和链接**:在Linux环境下,C和C++代码通常使用`gcc`或`g++`编译器进行编译。编译过程包括预处理、编译、汇编和链接。链接阶段会连接到所需的系统库,以实现特定的系统功能。 6. **调试和测试**:`gdb`是...

    Linux下C语言编程教程

    ### Linux下C语言编程教程知识点概览 #### 第一章 基础知识 - **源程序编译**: 在Linux环境中使用GCC(GNU Compiler Collection)编译器进行C语言源程序的编译工作。GCC是一个功能强大的编译器,支持多种编程语言。...

    异步非阻塞C语言爬虫

    在C语言中,通常使用gethostbyname等函数进行DNS解析,但在异步模式下,这些函数会导致阻塞。而libevent提供了非阻塞的API,可以在后台线程中进行DNS查询,当查询结果准备好时,再通知主线程。 epoll是Linux内核...

    linux常用命令大全.pdf

    3. **ln**:创建文件的硬链接或软链接(符号链接)。 4. **uname**:显示系统的信息。 5. **date**:显示或设置系统的日期和时间。 6. **clear**:清空终端屏幕。 以上介绍的命令只是Linux系统中的一部分,随着...

    Linux下的C编程_linux_

    10. **网络编程**:Linux下,`&lt;sys/socket.h&gt;`和`&lt;netinet/in.h&gt;`等头文件提供了网络编程接口,如创建套接字、连接服务器、发送和接收数据等。 11. **错误处理**:在C编程中,正确处理错误是关键。要学会检查函数...

    嵌入式Linux下文件I/O

    "库的制作及使用.rar"可能涵盖了如何创建自定义库,以及如何在嵌入式系统中链接和使用这些库。这对于开发和复用文件I/O相关的功能模块至关重要。库可以封装复杂操作,简化程序设计,同时优化性能。 5. **实践应用*...

    Linux UNIX系统编程手册(下册)

    此外,文件系统部分会介绍文件和目录的操作,如open(), close(), read(), write(), mkdir(), rmdir()等,以及文件权限和硬链接、软链接的概念。对于需要处理文件存储和访问的开发者来说,这部分内容极具价值。 最后...

    linux 下C语言编程

    3. **Linux下的编译与链接**: - 使用GCC编译器编译C程序 - 链接静态库和动态库 - 编译选项与优化级别 4. **调试技术**: - 使用GDB进行程序调试 - 断点设置、变量查看、单步执行等基本操作 #### 三、Linux...

    Linux编程技术详解

    通过`plugin`这个文件名,我们可以推测这份资料可能包含有关动态插件或库的编程实践,这在Linux下通常涉及到动态链接和共享对象(.so文件)的使用。 进程和线程管理是另一个重点。Linux提供fork()和pthread_create...

    linux操作系统课程设计

    Linux中的EXT4、XFS等文件系统的结构、挂载、卸载、文件权限、硬链接和软链接等知识是课程的重点。 5. **设备驱动**:设备驱动程序使操作系统能够控制硬件设备。理解I/O模型(如同步、异步、中断驱动I/O)以及编写...

    PPPoE.rar_linux pppoe_ppp linux_pppoe lin_pppos linux_拨号

    rp-pppoe是由Ross Patterson创建的一个著名项目,它提供了在Linux上实现PPPoE服务和客户端功能的软件包。这个程序作为公司开发项目的一部分,可以作为一个优秀的参考模板,对于开发者来说,理解其工作原理和实现方式...

    Linux下C编程

    【Linux下C编程】主要涉及的是在Linux操作系统中进行C语言程序开发的相关知识。Linux是一种开源的操作系统,它为开发者提供了丰富的工具和环境来进行各种类型的编程,包括C语言。C编程在Linux环境下具有广泛的应用,...

    android_Linux的socket链接.zip

    本文将深入探讨Android与Linux平台下Socket通信的基础知识,包括Socket的工作原理、创建过程、连接步骤以及相关编程实践。 一、Socket工作原理 Socket源自Unix系统,它是一个编程接口(API),允许应用程序通过网络...

    Linux下协议栈源码分析

    - **各种异步手段**:列举了Linux内核中的异步处理方法。 - **虚拟文件系统**:讲解了Linux的VFS(Virtual File System)模型。 - **网络协议栈各部分初始化** - **网络基础系统初始化**:涉及了网络子系统的初始...

Global site tag (gtag.js) - Google Analytics