TCP多客户端服务器->远程控制(此篇用多线程实现!)
原理图:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210330130707674.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMzQzNjgy,size_16,color_FFFFFF,t_70)
完整代码如下:
#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)
{
sem_init(&sm, 0, 0);
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0)
{
perror("socket fail");
return -1;
}
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(8989);
addr.sin_addr.s_addr = INADDR_ANY;
int ret = bind(sockfd, (struct sockaddr*)&addr, sizeof(addr));
if(ret < 0)
{
perror("bind fail:");
return -1;
}
ret = listen(sockfd, 5);
if(ret < 0)
{
perror("listen error");
return -1;
}
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);
}
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);
}
}
实现结果:
浏览器(客户端)输入:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210330131040497.png)
8989为端口号,前面是虚拟机IP
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210330130837907.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMzQzNjgy,size_16,color_FFFFFF,t_70)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)