day02
本章目标
TCP客户/服务器模型 —>C/S模型- 回射客户/服务器,
echosrv.cechocli.c文件 - socket、bind、listen、accept、connect函数
socket函数
man 2 socket 查看帮助
包含头文件
<sys/socket.h>功能:创建一个套接字用于通信
原型:
int socket(int domain, int type, int protocol);
参数:
domain:指通信协议族(protocol family)type:指定socket类型。- 流式套接字
SOCK_STREAM; - 数据报套接字
SOCK_DGRAM; - 原始套接字
SOCK_RAW;
- 流式套接字
protocol:协议类型
返回值:
成功返回非负整数,它和文件描述符类似,我们把它称为套接字,简称套接字;
失败返回
-1。
bind函数
包含头文件
<sys/socket.h>功能:绑定一个本地地址到套接字
原型
ing bind(int sockfd, const struct sockaddr * addr, socklen_t addrlen);
参数
sockfd:sockfd函数返回的套接字addr:要绑定的地址addrlen:地址长度
返回值:
成功返回
0,失败返回-1。
listen函数
man 2 listenSOMAXCONN查看此宏,是第二个参数,表示队列的最大值
- 包含头文件
<sys/socket.h> - 功能:将套接字用于监听进入的连接
- 原型
int listen(in sockfd, int backlog);
- 参数
sockfd:socket函数返回的套接字backlog:规定内核为此套接字排队的最大连接个数- 返回值:成功返回
0,失败返回-1。
主动套接字:主动发起连接,会调用
connect()函数。被动套接字:用来接收连接的,会调用
accept()函数。
- 一般来说,
listen函数应该在调用socket和bind函数之后,调用函数accept之前调用 - 对于给定的监听套接口,内核要维护两个队列
- 1.已由客户发出并到达服务器,服务器正在等待完成相应的TCP三路握手过程
- 2.已完成连接的队列
accept函数
- 包含头文件
<sys/socket.h> - 功能:从已完成连接队列返回第一个连接,如果已完成连接队列为空,则阻塞。
- 原型:
int accept(int socket, struct sockaddr * addr, socklen_t * addrlen);
- 参数
sockfd:服务器套接字addr:将返回对等方的套接字地址addrlen:返回对等方的套接字地址长度。是一个输入输出的参数,所以一定要初始化。
- 返回值:成功返回i非负整数,失败返回
-1.
connect函数
- 包含头文件
<sys/socket.h> - 功能:建立一个连接至
addr所指定的套接字 - 原型
int connect(int sockfd, const struct sockaddr * addr, socklen_t addrlen);
- 参数
sockfd:未连接套接字addr:要连接的套接字地址adrlen:第二个参数addr长度- 返回值:成功返回
0,失败返回-1。