- 在网络程序里面,通常都是一个服务器处理多个客户机。
- 为了处理多个客户机的请求, 服务器端的程序有不同的处理方式。
其中重点掌握多线程模型和IO多路复用模型
循环服务器模型
1.概念:
服务器按照顺序依次处理客户端的请求。它在同一时刻只能处理一个客户端连接,处理完一个客户端的请求后,才会去处理下一个客户端的请求。
2.伪代码:
socket()
bind();
listen();
while(1){
accept();
while(1)
{
process(); //处理
}
close();
}
3.server.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc, char *argv[])
{
unsigned short port = 8080; // 本地端口
// 创建tcp套接字
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0)
{
perror("socket");
exit(-1);
}
// 配置本地网络信息
struct sockaddr_in my_addr;
bzero(&my_addr, sizeof(my_addr)); // 清空
my_addr.sin_family = AF_INET; // IPv4
my_addr.sin_port = htons(port); // 端口
my_addr.sin_addr.s_addr = htonl(INADDR_ANY); // ip
// 绑定
int err_log = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(my_addr));
if( err_log != 0)
{
perror("binding");
close(sockfd);
exit(-1);
}
// 监听,套接字变被动
err_log = listen(sockfd, 10);
if(err_log != 0)
{
perror("listen");
close(sockfd);
exit(-1);
}
printf("listen client @port=%d...\n",port);
while(1)
{
struct sockaddr_in client_addr;
char cli_ip[INET_ADDRSTRLEN] = "";
socklen_t cliaddr_len = sizeof(client_addr);
// 取出客户端已完成的连接
int connfd;
connfd = accept(sockfd, (struct sockaddr*)&client_addr, &cliaddr_len);
if(connfd < 0)
{
perror("accept");
continue;
}
// 打印客户端的ip和端口
inet_ntop(AF_INET, &client_addr.sin_addr, cli_ip, INET_ADDRSTRLEN);
printf("----------------------------------------------\n");
printf("client ip=%s,port=%d\n", cli_ip,ntohs(client_addr.sin_port));
// 接收数据
char recv_buf[512] = {0};
int len = recv(connfd, recv_buf, sizeof(recv_buf), 0);
// 处理数据,这里只是打印接收到的内容
printf("\nrecv data:\n");
printf("%s\n",recv_buf);
// 反馈结果
send(connfd, recv_buf, len, 0);
close(connfd); //关闭已连接套接字
printf("client closed!\n");
}
close(sockfd); //关闭监听套接字
return 0;
}
上面的代码不像伪代码一样有两个while循环,所以对于一个客户端的操作,只能执行一次就结束了,然后就接着监听下一个客户端。
4.运行效果:
服务端在同一时刻只能处理一个客户端的请求,当一个客户端请求完毕,服务端又接着等待下一个客户端的请求。
并发服务器模型
1.概念:
同一个时刻可以响应多个客户端的请求,常用的模型有
多进程模型
/
多线程模型
/IO
多路复用
模型
2.多进程模型
概念
每来一个客户端连接,开一个子进程来专门处理客户端的数据,实现简单,