美文网首页
tcp网络通信

tcp网络通信

作者: 旺财妹妹的铁锤哥哥 | 来源:发表于2016-11-15 21:10 被阅读50次

    感言:
    以及到了大四依然不敢说自己懂得socket这是一个功能强大用途广泛的系统调用。
    什么是socket:
    linux平台下的网络编程通过socket函数创建网络套接口,这犹如文件读取时的文件套接口一样。套接口即为一个标识,通过该套接口操作所有关于该连接的所有操作。
    如何编写一个tcp网络传输的demo:
    服务器: 客户端:
    1.套接口fd = socket(); 1.套接口fd = socket();
    2.bind();//绑定套接口和ip&&端口 2.connect()
    3.listen() ; 3.write()/read()
    4.accept(); 4.close()
    5.write()/read()
    6.close()
    再探socket:

            int Socket(int family, int type, int protocol)
    

    返回-1出错,非负值成功
    Family代表一个协议簇,系统中存在很多协议簇:
    AF_INET指定ipv4 AF_INET6 指定ipv6 AF_LOCAL 指定UNIX协议域
    AF_ROUTE路由套接字 AF_KEY密钥套接字
    Type 只一个套接口 的协议类型
    SOCK_STREAM指字节流 SOCK_DGRAM指数据报 SOCK_SEQPACKET有序分组
    SOCK_RAW原始套接字
    Protocol代表相应的传输协议
    IPPROTO_TCP tcp协议 IPPROTO_UDP udp传输协议 IPPROTO_SCTP sctp传输协议

    Socket提供了一些选项主要由setsockopt和getsockopt函数完成,
    Int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t optlen);
    Int setsockopt(int sockfd, int level, int optname, const void
    optval, socklen_t optlen);

    例子: 
    设置socket套接字能够复用地址:
        setsocket(socketfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
            SO_REUSEADDR代表地址复用:
                一般来说,一个端口释放后会等待两分钟之后才能再被使用,SO_REUSEADDR是让端口释放后立即就可以被再次使用。
    

    SO_REUSEADDR用于对TCP套接字处于TIME_WAIT状态下的socket(TCP连接中,先调用close()的一方会进入TIME_WAIT状态),才可以重复绑定使用。server程序总是应该在调用bind()之前设置SO_REUSEADDR套接字选项。

    SO_REUSEADDR允许启动一个监听服务器并捆绑其众所周知端口,即使以前建立的将此端口用做他们的本地端口的连接仍存在。这通常是重启监听服务器时出现,若不设置此选项,则bind时将出错。

    SO_REUSEADDR允许在同一端口上启动同一服务器的多个实例,只要每个实例捆绑一个不同的本地IP地址即可。对于TCP,我们根本不可能启动捆绑相同IP地址和相同端口号的多个服务器。
    
    SO_REUSEADDR允许单个进程捆绑同一端口到多个套接口上,只要每个捆绑指定不同的本地IP地址即可。这一般不用于TCP服务器。
    
    SO_REUSEADDR允许完全重复的捆绑:当一个IP地址和端口绑定到某个套接口上时,还允许此IP地址和端口捆绑到另一个套接口上。一般来说,这个特性仅在支持多播的系统上才有,而且只对UDP套接口而言(TCP不支持多播)。
    设置socket套接字keeplive:
        
    设置tcp socket:禁用纳格算法
    设置tcp socket:禁用delay ack(需要每次recv后调用)
    

    socket选项列表

    int Socket(int family, int type, int protocol)
    返回-1出错,非负值成功
    Family代表一个协议簇,系统中存在很多协议簇:
    AF_INET指定ipv4 AF_INET6 指定ipv6 AF_LOCAL 指定UNIX协议域
    AF_ROUTE路由套接字 AF_KEY密钥套接字
    Type 只一个套接口 的协议类型
    SOCK_STREAM指字节流 SOCK_DGRAM指数据报 SOCK_SEQPACKET有序分组
    SOCK_RAW原始套接字
    Protocol代表相应的传输协议
    IPPROTO_TCP tcp协议 IPPROTO_UDP udp传输协议 IPPROTO_SCTP sctp传输协议

    Socket提供了一些选项主要由setsockopt和getsockopt函数完成,
    Int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t optlen);
    Int setsockopt(int sockfd, int level, int optname, const void
    optval, socklen_t optlen);

    例子: 
    设置socket套接字能够复用地址:
        setsocket(socketfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
            SO_REUSEADDR代表地址复用:
                一般来说,一个端口释放后会等待两分钟之后才能再被使用,SO_REUSEADDR是让端口释放后立即就可以被再次使用。
    

    SO_REUSEADDR用于对TCP套接字处于TIME_WAIT状态下的socket(TCP连接中,先调用close()的一方会进入TIME_WAIT状态),才可以重复绑定使用。server程序总是应该在调用bind()之前设置SO_REUSEADDR套接字选项。

    SO_REUSEADDR允许启动一个监听服务器并捆绑其众所周知端口,即使以前建立的将此端口用做他们的本地端口的连接仍存在。这通常是重启监听服务器时出现,若不设置此选项,则bind时将出错。

    SO_REUSEADDR允许在同一端口上启动同一服务器的多个实例,只要每个实例捆绑一个不同的本地IP地址即可。对于TCP,我们根本不可能启动捆绑相同IP地址和相同端口号的多个服务器。
    
    SO_REUSEADDR允许单个进程捆绑同一端口到多个套接口上,只要每个捆绑指定不同的本地IP地址即可。这一般不用于TCP服务器。
    
    SO_REUSEADDR允许完全重复的捆绑:当一个IP地址和端口绑定到某个套接口上时,还允许此IP地址和端口捆绑到另一个套接口上。一般来说,这个特性仅在支持多播的系统上才有,而且只对UDP套接口而言(TCP不支持多播)。
    设置socket套接字keeplive:
        
    设置tcp socket:禁用纳格算法
    设置tcp socket:禁用delay ack(需要每次recv后调用)
    

    socket选项列表

    Paste_Image.png

    相关文章

      网友评论

          本文标题: tcp网络通信

          本文链接:https://www.haomeiwen.com/subject/ymklpttx.html