关于做ppt的网站有哪些内容,广告设计公司简介文案,机关作风建设网站,两个wordpress联通写在前面
Linux网络编程我是看视频学的#xff0c;Linux网络编程#xff0c;看完这个视频大概网络编程的基础差不多就掌握了。这个系列是我看这个Linux网络编程视频写的笔记总结。 高并发服务器
问题#xff1a;
根据上一个笔记#xff0c;我们可以写出一个简单的服务端…写在前面
Linux网络编程我是看视频学的Linux网络编程看完这个视频大概网络编程的基础差不多就掌握了。这个系列是我看这个Linux网络编程视频写的笔记总结。 高并发服务器
问题
根据上一个笔记我们可以写出一个简单的服务端和客户端通信但是我们发现一个问题——服务器只能连接一个客户端。然而在实际生活中我们发现一个服务器连接的客户端远远不止一个所以我们就要做一个高并发服务器。
解决方法
回看之前的代码之所以只能一对一通信是因为服务器只有一次执行accept的机会一旦建立连接成功就会去进行通信处理业务而其他想要建立连接的服务器就没办法建立连接。因此我们想到在Linux系统编程中学的进程和线程我们可以让父进程主线程去监听一定有客户端请求建立连接我们就创建子进程其他线程去和客户端建立连接进行通信父进程主线程继续监听。 多进程并发服务器
思路(步骤
前期准备工作 先用socket()生成一个套接字lfd用来监听用bind()对第一步生成的套接字绑定地址结构绑的是服务器的地址结构用listen()函数设置lfd的监听上限最大是128. 进入循环accept与客户端建立连接得到用于通信的套接字的文件描述符cfdfork()创建子进程对于父进程由于父进程只是监听不需要与客户端进行通信所以我们就关闭cfd注册信号捕捉函数用来回收子进程然后一直循环监听。对于子进程由于子进程只是进行通信不需要监听所以我们就关闭lfd然后就与客户端进行通信处理业务。
源代码
#includestdio.h
#includestring.h
#includectype.h
#includestdlib.h
#includeunistd.h
#includesys/socket.h
#includearpa/inet.h
#includesignal.h#define PORT 6666void sys_err(char* str)
{perror(str);exit(-1);
}void wait_child(int signum) //信号捕捉回收子进程
{while((waitpid(0,NULL,WNOHANG))0);
// if(waitpid(0,NULL,0)!-1)
// printf(disconnect a client successfully\n);return;
}int main()
{struct sockaddr_in addr_s,addr_c;socklen_t addr_c_lensizeof addr_c;int lfd,cfd,res,n;pid_t pid;struct sigaction act;char buf[BUFSIZ],client_IP[1024];lfdsocket(AF_INET,SOCK_STREAM,0);if(lfd0)sys_err(socket error);addr_s.sin_familyAF_INET;addr_s.sin_porthtons(PORT);addr_s.sin_addr.s_addrhtonl(INADDR_ANY);resbind(lfd,(struct sockaddr*)addr_s,sizeof addr_s);if(res-1)sys_err(bind error);reslisten(lfd,128);if(res-1)sys_err(listen error);while(1){cfdaccept(lfd,(struct socket*)addr_c,addr_c_len);pidfork(); //创建子进程if(pid0) //子进程{close(lfd); //打印客户端的IP和端口号可以省略printf(connect successfully,client IP:%s,port:%d\n,inet_ntop(AF_INET,addr_c.sin_addr.s_addr,client_IP,sizeof client_IP),ntohs(addr_c.sin_port));break;}else if(pid0){close(cfd);act.sa_handlerwait_child;sigemptyset(act.sa_mask);act.sa_flags0;sigaction(SIGCHLD,act,NULL);continue;}}if(pid0) //父进程{while(1){nread(cfd,buf,sizeof buf);for(int i0;in;i)buf[i]toupper(buf[i]);write(cfd,buf,n);write(STDOUT_FILENO,buf,n);}}close(cfd);close(lfd);return 0;
}效果 多线程并发服务器
思路步骤
前期准备工作 先用socket()生成一个套接字lfd用来监听用bind()对第一步生成的套接字绑定地址结构绑的是服务器的地址结构用listen()函数设置lfd的监听上限最大是128. 进入循环accept与客户端建立连接得到用于通信的套接字的文件描述符cfd创建子线程对于子线程由于子线程只是进行通信不需要监听所以我们就关闭lfd然后就与客户端进行通信处理业务。对于父进程由于父线程只是监听不需要与客户端进行通信所以我们就关闭cfd然后设置线程pthread_detach()分离或者使用pthread_join()回收子线程。
源代码
#includestdio.h
#includestdlib.h
#includestring.h
#includectype.h
#includeunistd.h
#includesys/socket.h
#includearpa/inet.h
#includepthread.h#define PORT 6666void sys_err(char* str)
{perror(str);exit(-1);
}void* fun(void* arg)
{int cfd(int) arg,n;char buf[BUFSIZ];while(1){nread(cfd,buf,sizeof buf);if(n0){printf(one client closed......\n);break;}for(int i0;in;i)buf[i]toupper(buf[i]);write(cfd,buf,n);write(STDOUT_FILENO,buf,n);}close(cfd);return NULL;
}int main()
{struct sockaddr_in addr_s,addr_c;socklen_t addr_c_lensizeof addr_c;char c_IP[1024];int lfd,cfd,res;pthread_t tid;addr_s.sin_familyAF_INET;addr_s.sin_porthtons(PORT);addr_s.sin_addr.s_addrhtonl(INADDR_ANY);lfdsocket(AF_INET,SOCK_STREAM,0);if(lfd0)sys_err(socket errro);resbind(lfd,(struct sockaddr*)addr_s,sizeof addr_s);if(res0)sys_err(bind error);reslisten(lfd,128); if(res0)sys_err(listen error);printf(accepting connect........\n);while(1){cfdaccept(lfd,(struct sockaddr*) addr_c,addr_c_len);if(cfd-1)sys_err(accept error);printf(connect successfully,client ip:%s,port:%d\n,inet_ntop(AF_INET,addr_c.sin_addr.s_addr,c_IP,sizeof c_IP),ntohs(addr_c.sin_port));respthread_create(tid,NULL,fun,(void*)cfd);if(res!0)fprintf(stderr,pthread create error:%s,strerror(res));pthread_detach(tid); if(res!0)fprintf(stderr,pthread create error:%s,strerror(res));}close(lfd);return 0;
}效果 写在最后
个人亲身经验我们学习的一系列Linux命令一定要自己亲手去敲。不要只是看别人敲代码不要只是停留在眼睛看脑袋以为自己懂了等你实际上手去敲会发现许许多多的这样那样的问题。毕竟“实践出真知”。 如果你觉得我写的题解还不错的请各位王子公主移步到我的其他题解看看 数据结构与算法部分还在更新中 C STL总结 - 基于算法竞赛强力推荐动态规划——01背包问题动态规划——完全背包问题动态规划——多重背包问题动态规划——分组背包问题动态规划——最长上升子序列LIS)二叉树的中序遍历三种方法最长回文子串最短路算法——DijkstraC实现最短路算法———Bellman_Ford算法C实现最短路算法———SPFA算法C实现最小生成树算法———prim算法C实现最小生成树算法———Kruskal算法C实现染色法判断二分图C实现 Linux部分还在更新中 Linux学习之初识LinuxLinux学习之命令行基础操作Linux学习之基础命令适合小白Linux学习之权限管理和用户管理Linux学习之制作静态库和动态库Linux学习之makefileLinux学习之系统编程1关于读写系统函数Linux学习之系统编程2关于进程及其相关的函数Linux学习之系统编程3进程及wait函数Linux学习之系统编程4(进程间通信Linux学习之系统编程5(信号Linux学习之系统编程6(线程Linux学习之系统编程7(线程同步/互斥锁/信号量/条件变量Linux学习之网络编程纯理论Linux学习之网络编程2socket简单C/S模型 ✨总结
“种一颗树最好的是十年前,其次就是现在” 所以, “让我们一起努力吧,去奔赴更高更远的山海” 如果有错误❌,欢迎指正哟
如果觉得收获满满,可以动动小手,点点赞,支持一下哟