一、TCP客户/服务器模型
二、socket函数
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
功能:创建一个套接字用于通信
参数:domain:指定通信协议族
type:指定套接字类型,SOCK_STREAM,SOCK_DGRAM,SOCK_RAW
protocol:协议类型
返回值:成功返回非负整数,类似文件描述符,称为套接字描述字。失败返回-1.
三、bind函数
int bind(int sockfd,const struct sockaddr *addr,socklen_t addrlen);
参数:
sockfd:socket函数返回的套接字
addr:要绑定的地址
addrlen:地址长度
返回值:成功返回0,失败返回-1
四、listen
int listen(int sockfd,int backlog);
参数:
sockfd:socket函数返回的套接字
backlog:规定内核为此套接字排队的最大连接个数,未完成连接队列加已完成连接队列。可以用宏SOMAXCONN。
返回值:成功返回0,失败返回-1.
监听后,套接字就变成了被动套接字,即接受连接的套接字,accept。主动套接字是用来发起连接的,connect。
三个状态:三次握手未完成,三次握手完成但未被接受,已被accept。
五、accept
int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);
功能:从已完成连接队列返回第一个连接,如果队列为空,则阻塞。
参数:
sockfd:服务器套接字
addr:
将存储对等方的套接字地址
addrlen:addr的长度
返回值:成功返回非负整数,失败返回-1。
从返回的套接字中读写信息即是与对等方的通信。称为已连接套接字,不再处于监听状态,属于主动套接字!
六、connect
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
参数:
sockfd:套接字
addr:对方地址
addrlen:addr长度
返回值:成功返回0,失败返回-1.通过sockfd与对方通信!
注:假设accept返回的是conn,逻辑上来说客户端通过sockfd与服务器的conn进行通信。conn的地址是在bind的时候确定的,sock的地址包括本机的IP地址和自动选择的一个端口号。对于服务器端来说,一旦连接成功,它会将客户端地址填充到accept的addr参数中,addrlen一定要初始化,他是一个输入输出参数。