Linux迭代服务器
Linux迭代服务器
最近在学习linux下Socket开发,最简单的就是迭代服务器
在网络程序里面,通常都是一个服务器处理多个客户机,为了出个多个客户机的请求,服务器端的程序有不同的处理方式。本节开始介绍Linux下套接字编程的服务器模型选择,主要包括循环服务器模型、并发服务器模型、IO复用服务器模型等,这也是我们常见的几种网络服务器模型。其中基本可以分为两大类,
- 迭代服务器:循环服务器在同一时刻只能响应一个客户端的请求,是比较简单的一种模型;
- 并发服务器:并发服务器在同一时刻可以响应多个客户端的请求,这里面又有很多分类,接下来会逐步介绍;
迭代服务器模型
迭代服务器是指对于客户端的请求和连接,服务器逐个进行处理,处理完一个连接后再处理下一个连接,属于串行处理方式,结构比较简单。样例代码是服务端向客户端输出日期时间的功能。
以下是服务端代码:
server.c
#include <sys/types.h> #include <stdio.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <time.h> #include <string.h> #include <stdio.h> #define BUFFLEN 1024 #define SERVER_PORT 12346 #define BACKLOG 5 int main(int argc, char *argv[]) { printf("等待客户端连接:\n"); int s_s, s_c; /*服务器套接字文件描述符*/ struct sockaddr_in local, from; /*本地地址*/ time_t now; char buff[BUFFLEN]; int n = 0; int len = sizeof(from); /*建立TCP套接字*/ s_s = socket(AF_INET, SOCK_STREAM, 0); /*初始化地址*/ memset(&local, 0, sizeof(local)); local.sin_family = AF_INET;/*AF_INET协议族*/ local.sin_addr.s_addr = htonl(INADDR_ANY);/*任意本地地址*/ local.sin_port = htons(SERVER_PORT);/*服务器端口*/ /*将套接字文件描述符绑定到本地地址和端口*/ int err = bind(s_s, (struct sockaddr*)&local, sizeof(local)); err = listen(s_s, BACKLOG);/*侦听*/ /*主处理过程*/ while(1) { /*接收客户端连接*/ s_c = accept(s_s, (struct sockaddr*)&from, &len); memset(buff, 0, BUFFLEN); n = recv(s_c, buff, BUFFLEN,0);/*接收发送方数据*/ if(n > 0 && !strncmp(buff, "TIME", 4))/*判断是否合法接收数据*/ {printf("have one\n"); memset(buff, 0, BUFFLEN); now = time(NULL); sprintf(buff, "%12s\r\n",ctime(&now)); send(s_c, buff, strlen(buff),0);/*发送数据*/ sleep(10);//此处沉睡10秒 } close(s_c); } close(s_s); return 0; }
以下是客户端代码:
client.c #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <string.h> #include <stdio.h> #define BUFFLEN 1024 #define SERVER_PORT 12346 int main(int argc, char *argv[]) { int s; /*服务器套接字文件描述符*/ struct sockaddr_in server; /*本地地址*/ char buff[BUFFLEN]; int n = 0; /*建立TCP套接字*/ s = socket(AF_INET, SOCK_STREAM, 0); /*初始化地址*/ memset(&server, 0, sizeof(server)); server.sin_family = AF_INET;/*AF_INET协议族*/ server.sin_addr.s_addr = htonl(INADDR_ANY);/*任意本地地址*/ server.sin_port = htons(SERVER_PORT);/*服务器端口*/ /*连接服务器*/ int err = connect(s, (struct sockaddr*)&server,sizeof(server)); memset(buff, 0, BUFFLEN); strcpy(buff, "TIME"); /*发送数据*/ send(s, buff, strlen(buff), 0); memset(buff, 0, BUFFLEN); /*接收数据*/ n = recv(s, buff, BUFFLEN, 0); if(n >0){ printf("TIME:%s",buff); } close(s); return 0; }
为了证明是迭代服务器,,故意在服务器中处理完一个连接后睡眠10秒,开启两个客户端,如图,可以看到时间差距为10秒,因为循环服务器成功。
相关推荐
bluecarrot 2020-11-23
Attend 2020-11-17
ZHAICAN 2020-11-16
codedecode 2020-11-14
zhangbingb 2020-11-12
ykmail 2020-11-11
futurezone 2020-11-06
rikeyone 2020-11-04
橄榄 2020-11-04
WenCoo 2020-10-31
farwang 2020-11-25
星愿心愿 2020-11-24
tianhuak 2020-11-24
zhjn0 2020-11-24
昭君出塞 2020-11-23
linuxwcj 2020-10-21
以梦为马不负韶华 2020-10-20