tcp编程流程:面向对象、可靠传输、面向字节流
客户端:
- 创建套接字
- 描述地址信息
- 发起连接请求
- 连接建立成功
- 收发数据
- 关闭
服务端:
- 创建套接字
- 描述地址信息
- 开始监听
- 接收连接请求
- 新建套接字
- 获取新建套接字描述符
- 通过这个描述符与客户端通信
- 关闭
tcp编程socket接口
1.创建套接字int socket(int domian, int type, int protocol);
- domian:地址域–不同的网络地址结构 AF_INET(IPv4地址域)
- type:套接字类型–流式套接字、数据报套接字
- 流式套接字:有序的、可靠的、双向的、基于连接的字节流传输 SOCK_STREAM
- 数据报套接字:无连接的、不可靠的、有最大长度限制的传输 SOCK_DGRAM
- protocol:使用的协议–不同套接字类型下的默认协议。
流式套接字默认为tcp。数据报套接字默认是udp。- IPPROTO_TCP:tcp协议
- IPPROTO_UDP:udp协议
- 返回值:返回套接字的操作句柄–文件描述符
2.绑定地址信息int bind(int sockfd, struct sockaddr *addr, socklen_t len);
- sockfd:创建套接字返回的操作句柄
- addr:要绑定的地址信息结构
- len:地址信息的长度
- 返回值:成功返回0。失败返回-1。
3.服务端开始监听int listen(int sockfd, int backlog);–告诉操作系统开始接受连接请求
- backlog:决定同一时间,服务端所能接受的客户端连接请求数量。但是这个并不能决定服务端能够接受多少客户端的个数。
4.获取新建socket的操作句柄
从内核指定socket的pending queue中取出一个socket,返回操作句柄。int accept(int sockfd, struct sockaddr *addr,socklen_t *len);
- sockfd:套接监听字–指定要获取哪个pending queue中的套接字
- addr:获取一个套接字,这个套接字与指定的客户端进行通信,通过addr获取这个客户端的地址信息
- len:输入输出型参数–指定地址信息想要的长度以及返回实际的地址长度
- 返回值:成功则返回新获取的套接字的描述符:操作句柄。失败返回-1。
5.通过新获取的套接字操作句柄(accept返回的描述符)与指定客户端进行通信
- 接收数据:
ssize_t recv(int sockfd, char *buf, int len, int flag);- 返回值:成功返回实际读取的数据长度。
连接断开返回0。tcp连接断开也是写端被关闭的一种表现。
读取失败返回-1。
- 返回值:成功返回实际读取的数据长度。
- 发送数据:
ssize_t send(int sockfd, char *data, int len, int flag);- 返回值:成功返回实际发送的数据长度。
失败返回-1。
若连接断开,recv返回0。send会触发异常导致进程退出。
- 返回值:成功返回实际发送的数据长度。
6.关闭套接字:释放资源。int close(int fd);
7.客户端向服务端发送连接请求int connect(int sockfd, int sockaddr *addr, socklen_t len);
- sockfd:客户端套接字–若还未绑定地址,则操作系统会选择合适的源端地址进行绑定。
- addr:服务端地址信息–struct sockaddr_in。这个地址信息经过connect之后也会描述到socket中
- len:地址信息长度。