Artical–4--并发服务器

并发服务器用到了 fork() 和 信号量。测试时可以用之前的客户端代码。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#include <arpa/inet.h>
#include <sys/socket.h>#define BUF_SIZE 30
void error_handling(char * message);
void read_childproc(int sig);int main(int argc,char * argv[])
{int serv_sock;int clnt_sock;char buf[BUF_SIZE];struct sockaddr_in serv_adr;struct sockaddr_in clnt_adr;pid_t pid;struct sigaction act;socklen_t adr_sz;int str_len,state;if(argc != 2){printf("usage : %s <port>\n",argv[0]);exit(1);}act.sa_handler=read_childproc;sigemptyset(&act.sa_mask);act.sa_flags=0;state=sigaction(SIGCHLD,&act,0);serv_sock=socket(PF_INET,SOCK_STREAM,0);memset(&serv_adr,0,sizeof(serv_adr));serv_adr.sin_family = AF_INET;serv_adr.sin_addr.s_addr=htonl(INADDR_ANY);serv_adr.sin_port=htons(atoi(argv[1]));if(bind(serv_sock,(struct sockaddr*)&serv_adr,sizeof(serv_adr))==-1)error_handling("bind() error");if(listen(serv_sock,5)==-1)error_handling("listen() error");while(1){adr_sz=sizeof(clnt_adr);clnt_sock=accept(serv_sock,(struct sockaddr*)&clnt_adr,&adr_sz); if(clnt_sock==-1){printf("clnt_sock is -1\n");continue;}elseputs("new client connected...");pid=fork();if(pid==-1){close(clnt_sock);continue;}if(pid==0){close(serv_sock);while((str_len=read(clnt_sock,buf,BUF_SIZE))!=0)write(clnt_sock,buf,str_len);close(clnt_sock);puts("client disconnected...");return 0;}elseclose(clnt_sock);}close(serv_sock);return 0;
}void read_childproc(int sig){pid_t pid;int status;pid=waitpid(-1,&status,WNOHANG);printf("removed proc id: %d\n",pid);
}
void error_handling(char *message)
{fputs(message,stderr);fputc('\n',stderr);exit(1);}


参考书籍:
《TCP/IP网络编程》

Artical--4--并发服务器相关推荐

  1. socket编程和并发服务器

    socket这个词可以表示很多概念: 在TCP/IP协议中,"IP地址+TCP或UDP端口号"唯一标识网络通讯中的一个进程,"IP地址+端口号"就称为socke ...

  2. Linux 并发服务器雏形总结

    如下介绍一个并发回射客户端/服务器的雏形,所谓回射:就是客户端输入一条数据,服务器端读取并显示,然后服务器端再把刚读取的信息发送回客户端进行显示.示意图如下: 所谓并发服务器:就是一个服务器可以同时为 ...

  3. 使用池来实现并发服务器

    #使用池来实现并发服务器 import socket from multiprocessing import cpu_count,Pool from multiprocessing.pool impo ...

  4. 基于原子探索者stm32f407开发板的ucos-iii+lwip1.4.1的tcp server并发服务器完美解决例程(转)...

    源:基于原子探索者stm32f407开发板的ucos-iii+lwip1.4.1的tcp server并发服务器完美解决例程 转载于:https://www.cnblogs.com/LittleTig ...

  5. 从简单到高并发服务器(一)

    一个单线程的回声服务器 (Echo Server) 我们从一个简单的服务器开始说起. 它可以接受一个客户的连接,接收消息,然后把这个消息发送回去,关闭连接--完工.我们用 Linux 和 iOS / ...

  6. linux多进程网络实例,Linux下一个单进程并发服务器的实例 使用select

    /*单进程并发服务器实例.该程序采用单进程并发服务器算法实现的.*/ #include #include #include #include #include #include #include #i ...

  7. 2高并发服务器:多线程服务器

    1多线程并发服务器 在使用线程模型开发服务器时需要考虑以下问题: A调整进程最大文件描述符上限 B线程如有共享数据,考虑线程同步 C服务于客户端线程退出时,退出处理.(退出值,分离态) D系统负载,随 ...

  8. 1高并发服务器:多进程服务器

     1多进程并发服务器 使用多进程并发服务器时要考虑以下几点: A.父最大文件描述个数(父进程中需要close关闭accept返回的新文件描述符) B.系统内创建进程个数(和内存大小相关) C.进程 ...

  9. 【Linux网络编程】并发服务器的三种实现模型

    服务器设计技术有很多,按使用的协议来分有 TCP 服务器和 UDP 服务器,按处理方式来分有循环服务器和并发服务器. 循环服务器与并发服务器模型 在网络程序里面,一般来说都是许多客户对应一个服务器(多 ...

  10. 如何使用 Go 语言搭建企业级高并发服务器?

    每到节假日和过年,需要外出通行的人几乎都会遇到一个问题:抢火车票!当全国上亿人都在固定的时间段抢票,服务器动辄就要承受上百万级并发的情况时,你就会明白,一个支持高并发的服务器架构有多重要! 在后端程序 ...

最新文章

  1. 白话红黑树系列之二——红黑树的构建
  2. ICLR2018 | 深度学习顶会见闻,干货资源都在这里(附源码、论文链接)
  3. 布赖恩·凯利看好比特币现金:更多的用例可以转化为价值
  4. Ubuntu “载入软件包列表失败”
  5. 转:WebApi(一)
  6. 一个 bug / Masonry的引入
  7. 腾讯正式开源图计算框架Plato,十亿级节点图计算进入分钟级时代
  8. iOS中的异步和多线程概况
  9. 使用util.js处理表格
  10. JAVA 16进制转字符串问题
  11. 数学知识整理:布朗运动与伊藤引理 (Ito‘s lemma)
  12. 行测:判断推理之图形推理
  13. yarn安装插件报错: An unexpected error occurred: “https://registry.npmjs.org/vue-router: connect ETIMEDOUT
  14. echarts设置图标图例legend为圆,长方形,扇形等
  15. PTA 背包问题凑零钱
  16. java计算器GUI科学型计算器
  17. Java统计代码的执行时间的6种方法
  18. 计算机电源管理最高续航,高效电源管理芯片 vivo TWS Neo最大支持27小时续航
  19. 游戏设计梦工厂读书笔记(三)
  20. Android:详细解析RSSI概念

热门文章

  1. RecyclerView实现单选和多选功能
  2. 基于用户画像的精准营销
  3. 数学建模图书分享(全部都是经典,共28本)
  4. 智慧校园什么样?西北民大告诉你
  5. 953.验证外星语词典
  6. win7触摸板怎么关闭_win7系统防火墙关闭方法
  7. 斗拱展开面积表_中国传统古建筑斗拱.pdf
  8. 洛谷P1650:田忌赛马 ← 贪心算法
  9. 关于OPC UA TSN中TSN
  10. VUE+ELEMENTUI el-upload照片墙手动上传多张图片 保存和修改功能前后端完整实现