服务器端和客户端通信流程
需要掌握的基础知识:
1、文件描述符:每一个文件描述符都在内核里面对应两个内存,一个内存是读缓冲区,用于接收数据;一个是写缓冲区,用于发送数据
1、服务器端通信流程
1、创建用于监听的套接字,这个套接字是一个文件描述符,功能:检测是否有客户端发起的连接
int lfd = socket();
下面介绍socket函数:
int socket(int domain,int type,int protocol); // domain相当于是ip地址 //type 指在网络通信过程中使用的通信协议 经常使用到的是sock_stream(流式协议)和sock_dgram(暴式协议) //当type选择的是sock_stream,protocol选择0时,则表示使用tcp协议;当type选择sock_dgram,protocol选择0时,则表示使用udp协议 //返回值 用于套接字的文件描述符
2、将得到的监听的文件描述符和本地的ip端口进行绑定
bind();
bind函数:
int bind (int sockfd,const struct sockaddr *addr,socklen_t_addrlen); /* sockfd 用于监听的文件描述符 addr 存储本地的ip和端口(大端) socklen_t_addrlen 计算第二个参数所占用的内存大小 返回值 :若成功,则返回0;失败,返回-1 */
3、设置监听(成功之后开始监听,监听的是客户端的连接)
listen();
listen函数:
int listen(int sockfd,int backlog); //backlog 一次性最多能检测到多少个客户端请求,最大值128 //返回值 成功,返回0;失败,返回-1
4、等待并接受客户端的连接请求,建立连接,会得到一个新的文件描述符,没有新连接请求就阻塞
int cfd = accept();
accept函数:
int accept(int sockfd,struc sockaddr* addr,socklen_t *addrlen); //addr 传递客户端的ip和端口 //addrlen 第二个参数指向内存的大小 //返回值 用于通信的文件描述符
5、通信,读写操作默认都是阻塞的
read();//接收数据 write();//发送数据
read和write函数:
ssize_t read(int sockfd,void* buf,size_t size); /* sockfd 用于通信的文件描述符,accept()的返回值 buf 指向一个有效的内存,用于储存接收的数据 size buf指向内存的大小 返回值:大于0,实际接收的字节数 等于0,对方断开了连接 小于0,数据接收失败了 */ ssize_t write(int fd,const void *buf,size_t len); /* fd 通信的文件描述符,accept()的返回值 buf 传入参数,要发送的字符串 len 要发送的字符串长度 返回值:大于0,实际发送的字节数,和len是相等的 小于0,发送数据失败了 */
6、断开连接,关闭socket
close(); //挥手两次
close函数:
int close(int fd); //功能:要关闭的文件描述符
2、客户端通信流程
1、创建一个通信的socket
int cfd = socket();
2、连接服务器,需要知道服务器绑定的ip和端口
connect();
connect函数:
int connect(int sockfd,const struct sockaddr *addr,socklen_t_addrlen); //sockfd 客户端创建的用于通信的套接字 //addr 要连接的服务器端的ip和端口
3、通信
read();//接收数据 write();//发送数据
4、断开连接,关闭文件描述符
close();
下一篇:
各个平台下的mysql重启命令