行业知识
【linux高性能服务器编程】项目实战——仿QQ聊天程序源码剖析
hello !大家好呀! 欢迎大家来到我的Linux高性能服务器编程系列之项目实战——仿QQ聊天程序源码剖析,在这篇文章中,你将会学习到如何利用Linux网络编程技术来实现一个简单的聊天程序,并且我会给出源码进行剖析,以及手绘UML图来帮助大家来理解,希望能让大家更能了解网络编程技术!!!
希望这篇文章能对你有所帮助,大家要是觉得我写的不错的话,那就点点免费的小爱心吧!(注:这章对于高性能服务器的架构非常重要哟!!!)
目录
一.项目介绍
二.服务器代码剖析
2.1 头文件和相关数据声明
2.2 服务器连接准备代码
2.3 服务器处理逻辑代码
2.3 客户端代码剖析
一.项目介绍
像ssh这样的登录服务通常要同时处理网络连接和用户输入,这也可以使用I/O复用来实现。我们以poll为例实现一个简单的聊天室程序,以阐述如何使用I/O 复用技术来同时处理网络连接和用户输入。该聊天室程序能让所有用户同时在线群聊,它分为客户端和服务器两个部分。其中客户端程序有两个功能:一是从标准输入终端读入用户数据,并将用户数据发送至服务器;二是往标准输出终端打印服务器发送给它的数据。服务器的功能是接收,客户数据,并把客户数据发送给每一个登录到该服务器上的客户端(数据发送者除外)。下面我们依次给出客户端程序和服务器程序的代码。
二.服务器代码剖析
2.1 头文件和相关数据声明
#define _GNU_SOURCE 1#include#include#include#include#include#include#include#include#include#include#include#include#include#define user_limit 5 //最大客户连接数量#define buffer_size 64#define fd_limit 65535 //最大文件描述符数量struct client_data{//创建一个客户地址结构体 struct sockaddr_in address ; char * write_buf; char buf[buffer_size];};int setnonblocking (int fd){//将文件描述符改为非阻塞模式 int old_option = fcntl(fd , F_GETFL); int new_option = old_option | O_NONBLOCK;// 添加非阻塞选项 fcntl(fd , F_SETFL , new_option);//设置 return old_option;} 这部分代码包含了头文件,定义了一些宏,以及一个用于存储客户端数据的结构体,这个结构体是为了服务器更好控制来自客户端的socket套接字,以及灵活控制对socket套接字的读写,然后还定义了setnonblocking()函数来将传入的文件描述符利用fcntl函数改为非阻塞模式,方便服务器进行监听。
2.2 服务器连接准备代码
这段代码是服务器端程序的入口和初始化部分。下面是逐行的解释:
int main(int argc , char *argv[]){ if(argc =0); 创建一个TCP套接字(SOCK_STREAM)用于监听客户端连接,并检查套接字是否创建成功。
int ret = bind(listenfd , (struct sockaddr*)&address , sizeof(address));//绑定 assert(ret !=-1);
将套接字绑定到之前设置的服务器地址上,并检查绑定操作是否成功。
ret = listen(listenfd ,5);//最多同时监听五个 assert(ret!=-1);
调用listen函数,使套接字进入监听状态,并设置最大同时连接数为5。然后检查监听操作是否成功。
//创建user数组,放入多个客户对象,并且使用socket的值可以直接用来索引(作为数组下标)连接对应的client_data对象 struct client_data * user = malloc(fd_limit * sizeof(struct client_data)); //为了提高poll性能,限制用户数量 struct pollfd *fds = malloc(sizeof(struct pollfd) * 6); int user_counter = 0;//计算客户连接数量 int i=0; for( i = 1 ; i
上一篇:接收服务器怎么设置方法?
下一篇:方舟纤维服务器怎么搜?