TCP服务器多线程 多进程简单测试

来源:互联网 发布:js 日期转时间戳 编辑:程序博客网 时间:2024/05/29 18:00

服务器一般都要求可以同时处理 多个客户的数据请求,利用进程和线程可以实现服务器监听和处理的分离,实现同时处理多个客户端的连接请求,


多进程:

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<unistd.h>//#include<pthread.h>#include<errno.h>int main(){   int fd = socket(AF_INET,SOCK_STREAM,0);   printf("socket id = %d\n",fd);   struct sockaddr_in serveraddr;   serveraddr.sin_family = AF_INET;   serveraddr.sin_port = htons(7777);   serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);   int err = bind(fd,(struct sockaddr *)&serveraddr,sizeof(serveraddr));   if(err < 0)   {      fprintf(stderr,"bind error:%s\n",strerror(err));      return -1;   }      listen(fd,5);   int newfd;   struct sockaddr_in peer;   socklen_t size;   size = sizeof(peer);   while(1)   {      printf("waiting for cilent connectting...\n");      newfd = accept(fd,(struct sockaddr *)&peer,&size);      printf("ip:%s,port:%d\n",inet_ntoa(peer.sin_addr),ntohs(peer.sin_port));      int pid = fork();      if(pid == 0)      {         char buff[100];         int cnt;         while(1)         {            fprintf(stdout,"pid:%u\n",getpid());            cnt = read(newfd,buff,100);            write(1,buff,cnt);            buff[cnt] = '\0';            if(strncmp(buff,"quit",4)==0)            break;               }         close(newfd);               }   }      close(fd);   return 0;}


多线程:

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<unistd.h>#include<pthread.h>#include<errno.h>void *thread_fun(void *arg){   int newfd = (int)arg;   char buff[100];   int cnt;   while(1)   {      fprintf(stdout,"thread:%u\n",pthread_self());      cnt = read(newfd,buff,100);      write(1,buff,cnt);      buff[cnt] = '\0';      if(strncmp(buff,"quit",4)==0)         break;         }   close(newfd);}int main(){   int fd = socket(AF_INET,SOCK_STREAM,0);   printf("socket id = %d\n",fd);   struct sockaddr_in serveraddr;   serveraddr.sin_family = AF_INET;   serveraddr.sin_port = htons(7777);   serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);   int err = bind(fd,(struct sockaddr *)&serveraddr,sizeof(serveraddr));   if(err < 0)   {      fprintf(stderr,"bind error:%s\n",strerror(err));      return -1;   }      while(1){   listen(fd,5);   int newfd;   struct sockaddr_in peer;   socklen_t size;   size = sizeof(peer);   while(1)   {      printf("waiting for cilent connectting...\n");      newfd = accept(fd,(struct sockaddr *)&peer,&size);      printf("ip:%s,port:%d\n",inet_ntoa(peer.sin_addr),ntohs(peer.sin_port));      pthread_t tid;      pthread_create(&tid,NULL,thread_fun,(void *)newfd);   }   }   close(fd);   return 0;}


0 0