1、什么是并发服务器?
并发服务器是指能够同时处理多个客户端业务的服务器。tcp通信是一对一进行有连接的方式,而这种服务器具有接收多个客户端连接的能力,并且允许多个客户端同时使用服务器资源。通过实现并发处理,服务器可以有效地利用系统资源,提高系统的性能和吞吐量,为多个用户同时提供服务。
2、如何实现并发服务器
并发服务器的实现方式包括多线程、多进程和异步IO等。多线程是常见的方式,服务器创建多个线程来处理多个客户端请求,提高系统的响应速度和效率。接下来文章以多线程的实现方式为例来体现并发服务器一对多的情形。
3、实例代码
void * recv_mob_thread(void *arg)
{
int ret;
int fd;
char buf[SIZE];
//char flag=0;
int newfd = *((int *)arg);
pthread_detach(pthread_self());
/*--------此处为服务线程逻辑代码段,即响应对应newfd客户端进行交互服务---------*/
}
void start_tcp_server(void)
{
int ret = -1;
int newfd ;
//recv_coord_fun();
//1.买电话
int fd = socket(AF_INET, SOCK_STREAM, 0);
if (fd == -1) {
perror("socket");
}
//重用端口
int on = 1;
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
//2.绑卡 ip+port
struct sockaddr_in server; //设置服务端ip+port
server.sin_family = AF_INET;
server.sin_port = htons(12345);
server.sin_addr.s_addr = htonl(INADDR_ANY);
//server.sin_addr.s_addr = inet_addr("192.168.10.251");
ret = bind(fd, (struct sockaddr *)&server, sizeof(server));
if (ret == -1) {
perror("bind");
}
//3.监听
listen(fd, 5);
//4.接听
struct sockaddr_in client; //接收客户端ip+port对象
socklen_t len = sizeof(client);
printf("tcp server start... \n");
system("netstat -na | grep 12345"); //查看tcp连接状态
// 接收客户请求并建立和服务器端连接 并发服务器
while (1) {
newfd = accept(fd, (struct sockaddr *)&client, &len); //阻塞函数
//没有客户端请求就让进程暂停,当有请求成功,建立连接返回
if (newfd == -1) {
perror("accept");
}
printf("client ip=%s\n", inet_ntoa(client.sin_addr));
printf("client port=%d\n", ntohs(client.sin_port));
printf("客户端 fd=%d 上线!\n", newfd);
//5.通信
//创建接收线程
pthread_t tid;
pthread_create(&tid, NULL, recv_mob_thread, &newfd);
}
//6.挂电话
sleep(10);
close(fd);
}
最关键的部分在于while(1)中加入了accept函数和pthread_create函数,并且每一个accept函数的返回值对应着不同的客户端,因此传入线程的newfd也一 一对应,从而实现所谓并发。