#include <sys/types.h>
#include <sys/socket.h>
// 创建一个套接字并返回一个套接字描述符
int socket(int domain, int type, int protocol);
| | |
| | |
V V V
协议族 协议类型 具体协议
#include <sys/types.h>
#include <sys/socket.h>
// 将套接字描述符对应的套接字与指定地址端口绑定
// 设置套接字的地址(端口+ip)
int bind(int sockfd, const struct sockaddr * my_addr, socklen_t addrlen);
| | |
| | |
V V V
套接字描述符 套接字地址结构 套接字地址结构的长度
| |
——————————|—————————
|
V
函数传递参数的惯用技巧
监听本地端口
#include <sys/socket.h>
// 1、更新套接字的状态为TCP_LISTEN
// 2、为等待队列申请空间
// 3、侦听本地端口,将客户端请求加入等待队列
int listen(int sockfd, int backlog);
| |
V V
套接字描述符 等待队列长度
接收网络请求
#include <sys/types.h>
#include <sys/socket.h>
// 1、创建一个客户端套接字(先用服务端的套接字信息进行初始化),产生对应的套接字描述符(用来保存连接成功的客户端的状态)
// 2、接受客户端连接请求,将相应的信息填入新建立的客户端套接字
// 3、将客户端的套接字描述符和地址信息传递给用户层
int accept(int sockfd, struct sockaddr * addr, socklen_t * addrlen);
| | | |
| | | |
V V V V
客户端套接字描述符 服务端套接字描述符 客户端地址结构 地址结构的长度
|___________________|
|
V
用来保存客户端的地址信息
连接目标服务器
#include <sys/types.h>
#include <sys/socket.h>
// 向目标服务器发送建立连接请求(三报文握手的第一次)
int connect(int sockfd, struct sockaddr * addr, int addrlen);
| | |
| | |
V V V
套接字描述符 目标服务器的地址结构 地址结构的长度
|______________|
|
V
目标服务器的地址(端口 + ip)
关闭套接字
#include <sys/socket.h>
// 关闭打开的套接字,释放系统资源
int close(int fd);
// 可以指定关闭方式
int shutdown(int s, int how);
| |
| |
V V
套接字描述符 关闭方式
|
___________________
| | |
V V V
SHUT_RD SHUT_WR SHUT_RDWR
切断读 切断写 切断读写