• socket编程函数总结


    1、创建socket:

    int socket( int domain , int type, int protocol );

    int sockfd = socket(AF_INET,SOCK_STREAM,0);

    domain:即为协议域(family)。

    type:指定socket类型。

    常用的socket类型有:

    SOCK_STREAM,

    SOCK_DGRAM,

    SOCK_RAW,

    SOCK_PACKET,

    SOCK_SEQPACKET等等。。。

    procotol:顾名思义就是指定协议。

    常用的协议有:

    IPPROTO_TCP,

    IPPTOTO_UDP,

    IPPROTO_TIPC,等,他们分别对应TCP传输协议,udp传输协议,sctp传输协议。

    注意:当protocol为0时,会自动选择type类型对应的默认协议。

    2、bind()函数。

    int bind(int sockfd,const struct sockaddr* addr,socklen_t addrlen);

    sockfd: 就是socket描述字,它是通过socket()函数创建了,唯一标识一个socket。bind()函数就是将给这个描述字绑定一个名字。

    addr: 一个sockaddr *指针,指向要绑定给sockfd的协议地址。这个地址根据地址创建socket时的地址协议族的不同而不同。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    struct sockaddr_in {
        sa_family_t    sin_family; /* address family: AF_INET */
        in_port_t      sin_port;   /* port in network byte order */
        struct in_addr sin_addr;   /* internet address */
    };
     
    /* Internet address. */
    struct in_addr {
        uint32_t       s_addr;     /* address in network byte order */
    };
    ipv6:
    struct sockaddr_in6 {
        sa_family_t     sin6_family;   /* AF_INET6 */
        in_port_t       sin6_port;     /* port number */
        uint32_t        sin6_flowinfo; /* IPv6 flow information */
        struct in6_addr sin6_addr;     /* IPv6 address */
        uint32_t        sin6_scope_id; /* Scope ID (new in 2.4) */
    };
     
    struct in6_addr {
        unsigned char   s6_addr[16];   /* IPv6 address */
    };

    addrlen:对应的就是地址的长度。

    3、listen()、connect()、函数:

    如果作为一个服务器,在调用socket(),bind(),之后就会调用listen()来监听这个socket,如果客户端这时调用connect()发出连接请求,服务器端就会接收到这个请求。

    int listen(int sockfd,int backlog);

    int connect(int sockfd, const struct sockaddr * addr, scoklen_t adrlen);

    listen()第一个参数就是要监听的socket描述字,第二个参数为响应的socket可以排队的最大连接数。socket()函数创建的socket默认是一个主动类型的,listen函数将socket变成被动类型的,等待客户的连接请求。

    connect()函数的第一个参数即为客户端的socket描述字,第二个参数为服务器的socket地址,第三个参数为socket地址的长度。客户端通过调用connect函数来建立与TCP服务器的连接。

    accept()函数:

    TCP客户端依次调用socket(),bind(),listen(),就会监听到socket地址了。TCP客户端依次调用socket()connect(),之后就想TCP服务器发送了一个连接请求。TCP服务器监听到这个情趣之后,就会调用accept()函数截取接收请求,这样连接就建立好了。之后就可以开始网络I/O操作了,即类同于普通文件的读写I/O操作。

    int accept(int sockfd, struct sockaddr* addr, socklen_t addrlen);

    sockfd:服务器的socket描述字,是服务器开始调用socket()函数生成的,称为监听socket套接字,而accept函数返回的是已连接的socket描述字。一个服务器通常仅仅只创建一个监听socket描述字,他在服务器的生命周期内一直存在。内核为每个由服务器进程接受的客户连接创建了一个一连接的socket描述字,当服务器完成了对某个客户的服务,相应的已连接的socket描述字就会被关闭。

  • 相关阅读:
    Tampermonkey 油猴脚本开发 入门
    k8s 上安装 lamp 环境
    centOS 7.9 k8s 安装 和 基本命令
    力扣59-螺旋矩阵 II
    力扣54-螺旋矩阵
    力扣705-设计哈希集合
    力扣706-设计哈希映射
    scrapy参数-COOKIES_ENABLED
    优雅降级、渐进增强
    e-cahr的地图组件封装(浙江省为例)
  • 原文地址:https://www.cnblogs.com/yjds/p/8597343.html
Copyright © 2020-2023  润新知