目录

十八、TCP多线程、多进程并发服务器

1、TCP多线程并发服务器

cpp 复制代码
服务端:
#include<stdio.h>
#include <arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <pthread.h>
#include <strings.h>
#define QUIT_STR "QUIT"
#define SERV_IP 5001
#define SERV_IP_ADDR "192.168.238.128" 
#define bufsize 1024
void* cilent_data_handle(void* arg)
{
	int newfd=*(int *)arg;
  char buf[bufsize];
  printf("thread handle:newfd = %d\n",newfd);
        int ret =-1;
        while(1)
        {
                do
                {
                        bzero(buf,bufsize);
                        ret=read(newfd,buf,bufsize-1);
                }while(ret<1);
                if(ret<0)
                {
                        exit(1);
                }
                if(!ret)
                {
                   break;
                }
                printf("recive data is %s\n",buf);
                if(!strncasecmp(buf,QUIT_STR,strlen(QUIT_STR)))
                                {
                                    printf("cilenr is exiting!\n");
                                    break;
                                    }
        }
        close(newfd);


}
int main()
{
	int fd=-1;
	fd=socket(AF_INET,SOCK_STREAM,0);
	if(fd == -1)
	{
		perror("socket");
			exit(1);
	}
	struct sockaddr_in sin;
	bzero(&sin,sizeof(sin));
	sin.sin_family=AF_INET;
	sin.sin_port = htons(SERV_IP);
	sin.sin_addr.s_addr = INADDR_ANY;
/*	if(inet_pton(AF_INET,SERV_IP_ADDR,(void*)&sin.sin_addr.s_addr)!=1)
	{
		perror("inet_pton");
		exit(1);
	}
	*/
	//2.bind
        if(bind(fd,(struct sockaddr *)&sin,sizeof(sin))<0)
	{
	   perror("bind");
	   exit(1);	   
	}
	//3.listen
	if(listen(fd,5)<0)
	{
		perror("listen");
		exit(1);
	}
	//4.accep
         int newfd=-1;
	 pthread_t tid;
	 struct sockaddr_in cin;
	 socklen_t addrlen=sizeof(cin);
	 while(1)
        {
	newfd= accept(fd,(struct sockaddr*)&cin,&addrlen);
	if(newfd<0)
	{
		perror("accept");
		exit(1);
	}
	char IPV4_addr[16];
	if(!inet_ntop(AF_INET,(void *)&cin.sin_addr,IPV4_addr,sizeof(cin)))
	{
		perror("inet_ntop");
		exit(1);
	}
	printf("cilent:(%s,%d)is connect\n",IPV4_addr,ntohs(cin.sin_port));
        pthread_create(&tid,NULL,cilent_data_handle,(void *)&newfd);
	}
	//read


	return 0;
}
cpp 复制代码
客户端:
#include<stdio.h>
#include <arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <strings.h>
#define QUIT_STR "QUIT"
#define SERV_IP 5001
#define SERV_IP_ADDR "192.168.238.128" 
#define bufsize 1024
int main(int arc,void **arg)
{
	if(arc!=3)
	{
		exit(1);
	}
	int port =-1;
	port=atoi(arg[2]);
	int fd=-1;
	fd = socket(AF_INET,SOCK_STREAM,0);
	if(fd == -1)
	{
		perror("socket");
		exit(1);
	}
	struct sockaddr_in sin;
	bzero(&sin,sizeof(sin));
	sin.sin_family = AF_INET;
	sin.sin_port=htons(port);
	sin.sin_addr.s_addr=inet_addr(arg[1]);
	if(connect(fd,(struct sockaddr*)&sin,sizeof(sin))==-1)
	{
		perror("connect");
		
		exit(1);
	}
	char buf[bufsize];
	while(1)
	{
		bzero(buf,strlen(buf));
		if(fgets(buf,bufsize-1,stdin)==NULL)
		{
		    continue;
		}
		write(fd,buf,strlen(buf));
		if(!strncasecmp(buf,QUIT_STR,strlen(QUIT_STR)))
		{
			break;
		}
		
	}
close(fd);

	return 0;
}

代码示例:

2、TCP多进程并发服务器

cpp 复制代码
服务端
#include<stdio.h>
#include <arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <pthread.h>
#include <strings.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
#define QUIT_STR "QUIT"
#define SERV_RESP_STR "SERVER:"
#define SERV_IP 5001
#define SERV_IP_ADDR "192.168.238.128" 
#define bufsize 1024
void child_data_handle(int signum)
{
	if(SIGCHLD==signum)
	{
		waitpid(-1,NULL,WNOHANG);
	}
}
void* cilent_data_handle(void* arg)
{
	int newfd=*(int *)arg;

  char buf[bufsize];
  printf("child process handle:newfd = %d\n",newfd);
        int ret =-1;
        while(1)
        {
                do
                {
                        bzero(buf,bufsize);
                        ret=read(newfd,buf,bufsize-1);
                }while(ret<1);
                if(ret<0)
                {
                        exit(1);
                }
                if(!ret)
                {
                   break;
                }
                printf("recive data is %s\n",buf);

                if(!strncasecmp(buf,QUIT_STR,strlen(QUIT_STR)))
                                {
                                    printf("cilenr is exiting!\n");
                                    break;
                                    }
        }
        close(newfd);


}
int main()
{
	int fd=-1;
	signal(SIGCHLD,child_data_handle);
	fd=socket(AF_INET,SOCK_STREAM,0);
	if(fd == -1)
	{
		perror("socket");
			exit(1);
	}
	struct sockaddr_in sin;
	bzero(&sin,sizeof(sin));
	sin.sin_family=AF_INET;
	sin.sin_port = htons(SERV_IP);
	sin.sin_addr.s_addr = INADDR_ANY;
/*	if(inet_pton(AF_INET,SERV_IP_ADDR,(void*)&sin.sin_addr.s_addr)!=1)
	{
		perror("inet_pton");
		exit(1);
	}
	*/
	//2.bind
        if(bind(fd,(struct sockaddr *)&sin,sizeof(sin))<0)
	{
	   perror("bind");
	   exit(1);	   
	}
	//3.listen
	if(listen(fd,5)<0)
	{
		perror("listen");
		exit(1);
	}
	//4.accep
         int newfd=-1;
	 pthread_t tid;
	 pid_t pid;
	 struct sockaddr_in cin;
	 socklen_t addrlen=sizeof(cin);
	 while(1)
        {

	newfd= accept(fd,(struct sockaddr*)&cin,&addrlen);
	if(newfd<0)
	{
		perror("accept");
		exit(1);
	}
        pid = fork();
	if(pid<0)
	{
		perror("fork");
		break;
	}
	if(pid == 0)
	{
	char IPV4_addr[16];
	if(!inet_ntop(AF_INET,(void *)&cin.sin_addr,IPV4_addr,sizeof(cin)))
	{
		perror("inet_ntop");
		exit(1);
	}
	printf("cilent:(%s,%d)is connect\n",IPV4_addr,ntohs(cin.sin_port));
	cilent_data_handle(&newfd);
        close(fd);
	}
	if(pid >0)
	{
	   close(newfd);
	}
	}
	//read


	return 0;
}
cpp 复制代码
​
客户端:
#include<stdio.h>
#include <arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <strings.h>
#define QUIT_STR "QUIT"
#define SERV_IP 5001
#define SERV_IP_ADDR "192.168.238.128" 
#define bufsize 1024
int main(int arc,void **arg)
{
	if(arc!=3)
	{
		exit(1);
	}
	int port =-1;
	port=atoi(arg[2]);
	int fd=-1;
	fd = socket(AF_INET,SOCK_STREAM,0);
	if(fd == -1)
	{
		perror("socket");
		exit(1);
	}
	struct sockaddr_in sin;
	bzero(&sin,sizeof(sin));
	sin.sin_family = AF_INET;
	sin.sin_port=htons(port);
	sin.sin_addr.s_addr=inet_addr(arg[1]);
	if(connect(fd,(struct sockaddr*)&sin,sizeof(sin))==-1)
	{
		perror("connect");
		
		exit(1);
	}
	char buf[bufsize];
	while(1)
	{
		bzero(buf,strlen(buf));
		if(fgets(buf,bufsize-1,stdin)==NULL)
		{
		    continue;
		}
		write(fd,buf,strlen(buf));
		if(!strncasecmp(buf,QUIT_STR,strlen(QUIT_STR)))
		{
			break;
		}
		
	}
close(fd);

	return 0;
}

​

运行结果:

本文是转载文章,点击查看原文
如有侵权,请联系 xyy@jishuzhan.net 删除
相关推荐
struggle202512 分钟前
LinuxAgent开源程序是一款智能运维助手,通过接入 DeepSeek API 实现对 Linux 终端的自然语言控制,帮助用户更高效地进行系统运维工作
linux·运维·服务器·人工智能·自动化·deepseek
只可远观32 分钟前
Flutter 泛型 泛型方法 泛型类 泛型接口
服务器·windows·flutter
无敌小茶1 小时前
Linux学习笔记之动静态库
linux·笔记
帽儿山的枪手1 小时前
socket套接字你搞清楚了吗
网络协议·面试
程序员JerrySUN2 小时前
驱动开发硬核特训 · Day 21(上篇) 抽象理解 Linux 子系统:内核工程师的视角
java·linux·驱动开发
白山云北诗2 小时前
什么是 DDoS 攻击?高防 IP 如何有效防护?2025全面解析与方案推荐
网络协议·tcp/ip·ddos·高防ip·ddos攻击怎么防·高防ip是什么
mxbb.3 小时前
我的HTTP和HTTPS
网络协议·http·https
雨声不在3 小时前
debian切换用户
linux·服务器·debian
不知名。。。。。。。。3 小时前
Linux—— 版本控制器Git
linux·运维·git
两点王爷3 小时前
springboot项目文件上传到服务器本机,返回访问地址
java·服务器·spring boot·文件上传