十八、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;
}

​

运行结果:

相关推荐
wdxylb1 小时前
云原生俱乐部-shell知识点归纳(1)
linux·云原生
飞雪20072 小时前
Alibaba Cloud Linux 3 在 Apple M 芯片 Mac 的 VMware Fusion 上部署的完整密码重置教程(二)
linux·macos·阿里云·vmware·虚拟机·aliyun·alibaba cloud
路溪非溪2 小时前
关于Linux内核中头文件问题相关总结
linux
海绵不是宝宝8174 小时前
连接远程服务器上的 jupyter notebook,解放本地电脑
服务器·jupyter·github
Lovyk5 小时前
Linux 正则表达式
linux·运维
Fireworkitte6 小时前
Ubuntu、CentOS、AlmaLinux 9.5的 rc.local实现 开机启动
linux·ubuntu·centos
sword devil9006 小时前
ubuntu常见问题汇总
linux·ubuntu
ac.char6 小时前
在CentOS系统中查询已删除但仍占用磁盘空间的文件
linux·运维·centos
繁星¹⁸⁹⁵8 小时前
通过update-alternatives可以实现cuda的多版本切换
服务器
淮北也生橘128 小时前
Linux的ALSA音频框架学习笔记
linux·笔记·学习