网络编程:TCP多线程实现多客户端服务器

2023-05-16

TCP多客户端服务器->远程控制(此篇用多线程实现!)

原理图:
在这里插入图片描述
完整代码如下:

#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <string.h>
#include <netinet/in.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>


void *client_thread(void *arg);
sem_t sm;//定义一个信号量


int main(void)
{
	//初始化信号量:wq
	sem_init(&sm, 0, 0);

	//1.创建套接字
	int sockfd = socket(AF_INET, SOCK_STREAM, 0);
	if(sockfd < 0)
	{
		perror("socket fail");
		return -1;
	}
	
	//2.绑定
	struct sockaddr_in addr;  //定一个存储地址,端口号的替代结构体
	//struct sockaddr_in *p = (struct sockaddr_in*)&addr;
	memset(&addr, 0, sizeof(addr)); //初始化为0
	addr.sin_family = AF_INET;//初始化地址族IPV4
	addr.sin_port = htons(8989); //设置端口号(网络字节序号)
	addr.sin_addr.s_addr = INADDR_ANY;//初始化绑定地址, 用INADDR_ANY--表示绑定本机地址
	int ret = bind(sockfd, (struct sockaddr*)&addr, sizeof(addr));
	if(ret < 0)
	{
		perror("bind fail:");
		return -1;
	}

	//3.监听
	ret = listen(sockfd, 5);
	if(ret < 0)
	{
		perror("listen error");
		return -1;
	}

	//4.接受链接, 没有客户端链接的时候此函数阻塞
	struct sockaddr_in clientaddr; //保存客户端地址
	socklen_t len = sizeof(clientaddr);//保存地址长度

	
	//主线程只负责接受客户端链接,不收发数据->收发数据在线程中实现
	while(1)
	{
		int clientfd = accept(sockfd, (struct sockaddr*)&clientaddr, &len);
		if(clientfd < 0)
		{
			perror("accept error");
			return -1;
		}

		//创建一个线程
		pthread_t id = 0;
		pthread_create(&id, NULL, client_thread, (void *)&clientfd);
		//分离线程
		pthread_detach(id);

		//把客户端套接字描述符保存(链表, 数组)

		//获取信号量资源
		sem_wait(&sm);//目的是等待->线程执行完int clientfd = *((int *)arg)这句再循环上面的内容
	}

	sem_destroy(&sm);
	//关闭套接字
	close(sockfd);
	return 0;
}

//线程-收发数据
void *client_thread(void *arg)
{
	int clientfd = *((int *)arg);
	//释放信号量资源
	sem_post(&sm);
	char recvbuffer[1024]={0};
	while(1)
	{
		int ret = read(clientfd, recvbuffer, 1024);
		if(ret <= 0)
		{
			printf("客户端%d掉线\n", clientfd);
			
			//把链表或数组中的套接字描述符要清理
			
			break;
		}

		printf("[clientfd=%d]%s\n",clientfd,  recvbuffer);
		
		//解析接收到的数据, 从链表或数组中找到对应用套接字描述符再发送数据
	}
}

实现结果:
浏览器(客户端)输入:
在这里插入图片描述
8989为端口号,前面是虚拟机IP
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

网络编程:TCP多线程实现多客户端服务器 的相关文章

随机推荐