1.通信流程
发送端 接收端
socket socket
bind
listen
connect accept
send recv
close close
2.函数接口
listen
int listen(int sockfd,int backlog);
功能:
监听三次握手连接请求
参数:
sockfd:套接字文件描述符
backlog:尚未处理的连接请求最大等待个数
返回值:
成功返回0
失败返回-1
accept
int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);
功能:处理等待队列中的第一个请求
参数:
sockfd:套接字文件描述符
addr:存放请求方地址信息空间的首地址
addrlen:请求方地址信息长度
返回值:
成功返回新的文件描述符
失败返回-1
recv
ssize_t recv(int sockfd,void *buf,size_tlen,int flags);
功能:接收数据
参数:
sockfd:套接字文件描述符
buf:存放接收到的数据空间首地址
len:最大接受字节数
flags:属性 ,默认为0
返回值:
成功返回实际接收到字节数
失败返回-1
如果对方退出返回0
send
ssize_t send(int sockfd,const void *buf,size_t len,int flags);
功能:
发送数据
参数:
sockfd:套接字文件描述符
buf:存放接收到的数据空间首地址
len:最大接受字节数
flags:属性 ,默认为0
返回值:
成功返回实际发送的字节数
失败返回-1
connect
int connect(int sockfd,const struct sockaddr *addr,socklen_t addrlen);
功能:发送链接请求
参数:
sockfd:套接字文件描述符
addr:对方的IP地址信息
addrlen:IP地址大小
返回值:
成功返回0
失败返回-1
3.粘包问题
TCP粘包是指发送方发送若干个数据包到接收方接受时粘成一包,从接受缓冲区看,后一包的数据紧接着前一包数据的尾。
解决方案:
1.特殊字符作为边界
2.自定义消息结构体
3.自定义通信协议(根本解决方案)