美文网首页
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/IP

    前言 TCP/IP 协议 是网络通信的基石,TCP/IP 协议 不是只有 TCP 和 IP 协议,它是整个网络通信...

  • 史上最简单的Sockte通信--1

    Socket,是基于网络通信协议封装的一个网络通信接口,可以支持TCP或UDP通信协议。通常是应用于TCP协议,这...

  • 从输入URL到浏览器显示页面发生了什么??

    一、网络通信互联网内各网络设备间的通信都遵循TCP/IP协议,利用TCP/IP协议族进行网络通信时,会通过分层顺序...

  • TCP流嗅探和连接跟踪工具tcpick

    TCP流嗅探和连接跟踪工具tcpick 由于网络通信协议众多,TCP连接状态众多,所以TCP分析较为复杂。Kali...

  • OSI网络体系结构与TCP/IP协议模型

    TCP/IP与OSI最大的不同在于:OSI是一个理论上的网络通信模型,而TCP/IP则是实际上的网络通信标准。 O...

  • tcp网络通信

    感言:以及到了大四依然不敢说自己懂得socket这是一个功能强大用途广泛的系统调用。什么是socket:linux...

  • 网络通信TCP

    TCP:传输控制协议 稳定 相对于UDP慢一些 web服务器都使用TCP UDP:用户数据包协议 不稳定 相比较T...

  • gen_tcp详解

    该模块 提供一组基于tcp/ip协议 socket 网络通信方法。 gen_tcp:connect/3 gen_t...

  • 理解基于 TCP 的应用层通信协议

    TCP 协议示意 关于七层网络通信的基本原理,特别推荐这篇图文并茂的长文《TCP/IP笔记 - 综述》 TCP 通...

  • tcp/ip的基本知识

    一.什么是tcp/ip tcp/ip是一类协议系统,它是用于网络通信的一套协议集合. 传统上来说tcp/ip被认为...

网友评论

      本文标题: tcp网络通信

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