行业网站怎么建设,软件开发属于什么行业类别,网站备案授权书怎么填写,17网站一起做网店广州转载#xff1a;http://www.cnblogs.com/lizhenghn/p/3617666.html 与循环服务器的串行处理不同#xff0c;并发服务器对服务请求并发处理。循环服务器只能够一个一个的处理客户端的请求#xff0c;显然效率很低。并发服务器通过建立多个子进程来实现对请求的并发处理。并发…转载http://www.cnblogs.com/lizhenghn/p/3617666.html 与循环服务器的串行处理不同并发服务器对服务请求并发处理。循环服务器只能够一个一个的处理客户端的请求显然效率很低。并发服务器通过建立多个子进程来实现对请求的并发处理。并发服务器的一个难点是如何确定子进程的数据因为不清楚请求客户端的数目因此实现中通常采用事先分配一定数目的子进程与动态增加子进程相结合的方法来实现并发服务器。 简单并发服务器模型 /* UDP简单并发服务器模型 */
/* 服务器主进程 */
socket(...);
bind(...);
fork(); //创建多个子进程进行请求处理
while(1);
/* 服务器子进程1 */
while(1)
{recvfrom(....);process(...);sendto(.....);
}
close(...);
/* 服务器子进程2(同上) */
..................
..................
..................
/* 服务器子进程3(同上) */
..................
..................
.................. /* TCP简单并发服务器模型 */
/* 服务器主进程 */
socket(...);
bind(...);
fork();//创建多个子进程进行请求处理
while(1);
/* 服务器子进程1 */
socket(...);
bind(...);
listen(...);
while(1)
{accept(...);recv(....)process(...);send(.....);
}
close(....);
/* 服务器子进程2(同上) */
..................
..................
..................
/* 服务器子进程3(同上) */
..................
..................
.................. 一个并发服务器的例子 下面给出一个简单的并发服务器样子仍然模拟服务器对外提供时间服务器等待客户端到来并返回给客户端服务器的当前时间。 UDP循环服务器 1 /** UDP并发服务器--server端程序**/2 #include sys/types.h3 #include sys/socket.h4 #include netinet/in.h5 #include time.h6 #include string.h7 #include stdio.h8 #define BUFFLEN 10249 #define SERVER_PORT 12347
10 #define BACKLOG 5
11
12 static void handle_request(int s, struct sockaddr_in* from, char *buff)
13 {
14 time_t now;
15 int len sizeof(*from);
16 memset(buff, 0, BUFFLEN);
17 now time(NULL);
18 sprintf(buff, %24s\r\n,ctime(now));
19 sendto(s, buff, strlen(buff),0, (struct sockaddr*)from, len);/*发送数据*/
20 }
21
22 static void handle_connect(int s_s)
23 {
24 struct sockaddr_in from; /*客户端地址*/
25 int len sizeof(from);
26 int n 0;
27 char buff[BUFFLEN];
28
29 /*主处理过程*/
30 while(1)
31 {
32 memset(buff, 0, BUFFLEN);
33 /*接收客户端连接*/
34 n recvfrom(s_s, buff, BUFFLEN,0,(struct sockaddr*)from, len);/*接收发送方数据*/
35 if(n 0 !strncmp(buff, TIME, 4))/*判断是否合法接收数据*/
36 {
37 /*创建进程进行数据处理*/
38 if(!fork())
39 {
40 handle_request(s_s, from, buff);/*处理连接请求*/
41 return ;
42 }
43 }
44 }
45 }
46
47
48 int main(int argc, char *argv[])
49 {
50 int s_s; /*服务器套接字文件描述符*/
51 struct sockaddr_in local; /*本地地址*/
52
53 /*建立TCP套接字*/
54 s_s socket(AF_INET, SOCK_STREAM, 0);
55
56 /*初始化地址接哦股*/
57 memset(local, 0, sizeof(local));
58 local.sin_family AF_INET;/*AF_INET协议族*/
59 local.sin_addr.s_addr htonl(INADDR_ANY);/*任意本地地址*/
60 local.sin_port htons(SERVER_PORT);/*服务器端口*/
61
62 /*将套接字文件描述符绑定到本地地址和端口*/
63 int err bind(s_s, (struct sockaddr*)local, sizeof(local));
64
65 /*处理客户端连接*/
66 handle_connect(s_s);
67
68 close(s_s);
69
70 return 0;
71 } TCP循环服务器 1 /** TCP并发服务器--server端程序**/2 #include sys/types.h3 #include sys/socket.h4 #include netinet/in.h5 #include time.h6 #include string.h7 #include stdio.h8 #define BUFFLEN 10249 #define SERVER_PORT 12347
10 #define BACKLOG 5
11
12 static void handle_request(int s_c)
13 {
14 time_t now;
15 char buff[BUFFLEN];
16 int n 0;
17 memset(buff, 0, BUFFLEN);
18 n recv(s_c, buff, BUFFLEN,0);/*接收发送方数据*/
19 if(n 0 !strncmp(buff, TIME, 4))/*判断是否合法接收数据*/
20 {
21 memset(buff, 0, BUFFLEN);
22 now time(NULL);
23 sprintf(buff, %24s\r\n,ctime(now));
24 send(s_c, buff, strlen(buff),0);/*发送数据*/
25 }
26 /*关闭客户端*/
27 close(s_c);
28 }
29
30 static void handle_connect(int s_s)
31 {
32 int s_c; /*客户端套接字文件描述符*/
33 struct sockaddr_in from; /*客户端地址*/
34 int len sizeof(from);
35
36 /*主处理过程*/
37 while(1)
38 {
39 /*接收客户端连接*/
40 s_c accept(s_s, (struct sockaddr*)from, len);
41 if(s_c 0)/*客户端成功连接*/
42 {
43 /*创建进程进行数据处理*/
44 if(fork() 0)/*父进程*/
45 {
46 close(s_c);/*关闭父进程的客户端连接套接字*/
47 }
48 else
49 {
50 handle_request(s_c);/*处理连接请求*/
51 return ;
52 }
53 }
54 }
55 }
56
57
58 int main(int argc, char *argv[])
59 {
60 int s_s; /*服务器套接字文件描述符*/
61 struct sockaddr_in local; /*本地地址*/
62
63 /*建立TCP套接字*/
64 s_s socket(AF_INET, SOCK_STREAM, 0);
65
66 /*初始化地址*/
67 memset(local, 0, sizeof(local));
68 local.sin_family AF_INET;/*AF_INET协议族*/
69 local.sin_addr.s_addr htonl(INADDR_ANY);/*任意本地地址*/
70 local.sin_port htons(SERVER_PORT);/*服务器端口*/
71
72 /*将套接字文件描述符绑定到本地地址和端口*/
73 int err bind(s_s, (struct sockaddr*)local, sizeof(local));
74 err listen(s_s, BACKLOG);/*侦听*/
75
76 /*处理客户端连接*/
77 handle_connect(s_s);
78
79 close(s_s);
80
81 return 0;
82 } 注意 1. 为了方便退出server程序中对信号SIGINT信号进行了处理此时所有的进程都会退出 2. 并发服务器中的client程序与上一节介绍循环服务器时使用的client程序是一样的这里不在贴出来 请参考 Linux网络编程服务器模型选择之循环服务器 http://www.cnblogs.com/lizhenghn/p/3617608.html