服务器端和客户端通信流程

通信

  • 1、服务器端通信流程
  • 2、客户端通信流程

需要掌握的基础知识:
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();

你可能感兴趣的:(服务器,网络,c++)