多客户模式

简介:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <sys/types.h>
#include <sys/time.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
 
int  main( int  argc,  char  const  *argv[])
{
     int  server_sockfd, client_sockfd;
     int  server_len, client_len;
     struct  sockaddr_in server_address;
     struct  sockaddr_in client_address;
     int  result;
     fd_set readfds,testfds;
 
     // create a socket for server and name it
     server_sockfd=socket(AF_INET,SOCK_STREAM,0);
 
     server_address.sin_family=AF_INET;
     server_address.sin_addr.s_addr=htonl(INADDR_ANY);
     server_address.sin_port=htons(9734);
     server_len= sizeof (server_address);
 
     //bind the socket and address
     bind(server_sockfd,( struct  sockaddr*)&server_address,server_len);
 
     listen(server_sockfd,5);
 
     FD_ZERO(&readfds);
     FD_SET(server_sockfd,&readfds);
 
     while (1){
         char  ch;
         int  fd;
         int  nread;
 
         testfds=readfds;
         printf ( "server waiting...\n" );
 
         result=select(FD_SETSIZE,&testfds,(fd_set*)NULL,(fd_set*)NULL,( struct  timeval*)0);
 
         if (result<1){
             perror ( "server5..." );
             exit (1);
         }
 
         for (fd=0;fd<FD_SETSIZE;fd++){
             if (FD_ISSET(fd,&testfds)){
                 if (fd==server_sockfd){
                     client_len= sizeof (client_address);
                     client_sockfd=accept(server_sockfd,( struct  sockaddr*)&client_address,&client_len);
                     FD_SET(client_sockfd,&readfds);
                     printf ( "adding client on fd %d\n" , client_sockfd );
                 } else {
                     ioctl(fd,FIONREAD,&nread);
 
                     if (nread==0){
                         close(fd);
                         FD_CLR(fd,&readfds);
                         printf ( "removing client on fd %d\n" ,fd );
                     } else {
                         read(fd,&ch,1);
                         sleep(3);
                         printf ( "server client on fd %d\n" ,fd );
                         ch++;
                         write(fd,&ch,1);
                     }
                 }
             }
         }
     }
 
     return  0;
}

  


==============================================================================
本文转自被遗忘的博客园博客,原文链接:http://www.cnblogs.com/rollenholt/archive/2012/07/10/2584778.html,如需转载请自行联系原作者

相关文章
|
存储 运维 Oracle
国产数据库:目前最火的五款国产数据介绍
随着互联网的高速发展,目前数据的存储越来越多,传统的数据库逐渐不能满足人们对海量数据、高效查询的需求,国产的数据库如雨后春笋一样,一个个冒了出来来解决我们高速科技发展的数据库瓶颈,今天就给大家聊一聊目前最火的五款国产数据库,大家一起来交流一下。
国产数据库:目前最火的五款国产数据介绍
|
安全 前端开发 API
ThinkPHP5 API模块开发规范与示例
【7月更文挑战第6天】本技术文档旨在指导开发者如何完全遵循ThinkPHP5框架的开发规范来构建RESTful API模块。ThinkPHP5(简称TP5)是一款基于PHP的轻量级MVC框架,其简洁、高效的特点非常适合快速开发Web应用及API接口。以下是创建API模块的基本步骤、最佳实践以及代码示例。
542 0
|
Java 应用服务中间件 数据库连接
【229秒 -> 69秒】部署时间缩短69%,ICBU商家技术部应用部署治理实践
部署时长不仅影响线上问题的解决恢复能力,也严重影响了我们日常的开发效率。本文记录了作者部署时的一些提效手段和最终的效果。
|
缓存 JavaScript API
vue学习之生命周期钩子
生命周期钩子
126 0
LeetCode第13题目罗马数字转整数
该文章介绍了 LeetCode 第 13 题罗马数字转整数的解法,通过从大到小解析罗马数字,根据罗马数字的特点,按照从大到小的顺序匹配罗马数字和整数的关系,从而解决该问题,同时强调要注意观察题目考查的知识点特征。
|
SQL 存储 数据库
常用数据库复习资料
常用数据库复习资料
|
人工智能 监控 Java
IDEA启动tomcat 端口1099被占用(1099 is already in use)
IDEA启动tomcat 端口1099被占用(1099 is already in use)
IDEA启动tomcat 端口1099被占用(1099 is already in use)
|
缓存 C语言 C++
9 个让你的 Python 代码更快的小技巧
9 个让你的 Python 代码更快的小技巧
|
数据采集 消息中间件 数据可视化
2、电商数仓(业务数据采集平台)电商业务流程、电商常识、电商系统表结构、业务数据模拟、业务数据采集模块(二)
2、电商数仓(业务数据采集平台)电商业务流程、电商常识、电商系统表结构、业务数据模拟、业务数据采集模块(二)
开发设计娱乐游戏直播网络平台,该如何进行?
要开发设计一个优秀的娱乐游戏直播网络平台,可以说是繁杂还有挑战性的工作,但总的来说开发模式就两种,源码开发以及定制开发,虽说这两种开发模式具有本质区别,可是最后的结果是相同的,下列分别就两种开发模式以及优点和缺点进行大概的描写。