TCP 三次握手函数调用

一、服务端监听连接

  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];   /* 路径名 */
};
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值