TCP 三次握手函数调用

  • Post author:
  • Post category:其他




一、服务端监听连接

  1. socket
  2. bind
  3. listen
  4. accept

服务端监听连接

1.socket

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

domain

PF_INET、PF_INET6、PF_LOCAL

type

SOCK_STREAM(字节流,对应 TCP)、SOCK_DGRAM(数据报,对应 UDP)、SOCK_RAW(原始套接字)

protocol

已废弃,一般写 0 即可

2.bind

bind(int fd, sockaddr* addr, socklen_t len)

fd

套接字描述符,socket() 函数返回值

sockaddr

通用地址格式,可能传的是 IPV4、IPV6 或本地套接字格式,会根据第三个参数 len 判断第二个参数 addr 如何解析,len 表示传入的地址长度

3.listen

int listen (int socketfd, int backlog)

socketfd

套接字描述符,socket() 函数返回值

backlog

未完成连接队列的大小

  1. accept
int accept(int listensockfd, struct sockaddr *cliaddr, socklen_t *addrlen)

listensockfd

套接字(监听套接字),socket() 函数返回值

cliaddr

客户端地址

addrlen

地址的大小

返回值代表当前与客户端的连接的描述字(已连接套接字)



二、客户端发起连接

  1. socket
  2. connect

客户端发起连接

  1. socket
int socket(int domain, int type, int protocol)
  1. connect
int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen)

sockfd

套接字(连接套接字)

servaddr

套接字结构体指针

addrlen

套接字结构体指针大小

套接字结构体包含服务器的 IP 地址和端口号

注:如果是 TCP 套接字,调用 connect 函数将激发 TCP 三次握手,而且仅在连接成功或出错时才返回



三、通配地址

通配地址

IPV4:INADDR_ANY

IPV6:IN6ADDR_ANY



四、地址格式

通用套接字地址格式

IPV4 套接字地址格式

IPV6 套接字地址格式

本地套接字格式

通用套接字地址格式

/* POSIX.1g 规范规定了地址族为 2 字节的值.  */
typedef unsigned short int sa_family_t;
/* 描述通用套接字地址  */
struct sockaddr{
    sa_family_t sa_family;  /* 地址族.  16-bit*/
    char sa_data[14];   /* 具体的地址值 112-bit */
}; 

IPV4 套接字地址格式

/* IPV4 套接字地址,32bit 值.  */
typedef uint32_t in_addr_t;
struct in_addr
{
    in_addr_t s_addr;
};

/* 描述 IPV4 的套接字地址格式  */
struct sockaddr_in
{
    sa_family_t sin_family; /* 16-bit */
    in_port_t sin_port;     /* 端口口  16-bit*/
    struct in_addr sin_addr;    /* Internet address. 32-bit */
    
    
    /* 这里仅仅用作占位符,不做实际用处  */
    unsigned char sin_zero[8];
};

IPV6 套接字地址格式

struct sockaddr_in6
{
    sa_family_t sin6_family; /* 16-bit */
    in_port_t sin6_port;  /* 传输端口号 # 16-bit */
    uint32_t sin6_flowinfo; /* IPv6 流控信息 32-bit*/
    struct in6_addr sin6_addr;  /* IPv6 地址 128-bit */
    uint32_t sin6_scope_id; /* IPv6 域 ID 32-bit */
};

本地套接字格式

struct sockaddr_un {
    unsigned short sun_family; /* 固定为 AF_LOCAL */
    char sun_path[108];   /* 路径名 */
};



版权声明:本文为qq_21586317原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。