Linux多进程服务器和多线程服务器
2020-03-08 本文已影响0人
FakeCSer爱去网吧
多进程
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <signal.h>
#include <sys/wait.h>
#include <iostream>
using namespace std;
#include <cstring>
#include <ctype.h>
#define SERVER_PORT 8888
void Mywait(int signum)
{
while(waitpid(0,NULL,WNOHANG)>0);
return;
}
int main()
{
int listenfd,connectfd;
char buf[BUFSIZ],clientip[BUFSIZ];
struct sockaddr_in serveraddr,clientaddr;
int n,i,ret;
socklen_t addrlen;
pid_t pid;
listenfd = socket(AF_INET,SOCK_STREAM,0);
if(listenfd == -1)
{
perror("socket");
exit(1);
}
bzero(&serveraddr,sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(SERVER_PORT);
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
ret = bind(listenfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr));
if(ret == -1)
{
perror("bind");
exit(1);
}
ret = listen(listenfd,128);
if(ret == -1)
{
perror("lisetn");
exit(1);
}
while(1)
{//父进程阻塞建立连接
addrlen = sizeof(clientaddr);
connectfd = accept(listenfd,(struct sockaddr*)&clientaddr,&addrlen);
if(connectfd == -1)
{
perror("accept");
exit(1);
}
printf("client ip is %s,port is %d\n",
inet_ntop(AF_INET,&clientaddr.sin_addr.s_addr,clientip,sizeof(clientip)),
ntohs(clientaddr.sin_port));
pid = fork();
if(pid ==-1 )
{
perror("fork");
exit(1);
}
else if(pid ==0)
{//son:operate
close(listenfd);
break;
}
else
{
close(connectfd);
signal(SIGCHLD,Mywait);
}
}
if(pid == 0)
{//子进程处理
while(1)
{
n = read(connectfd,buf,sizeof(buf));
if(n >0)
{
for(i=0;i<n;i++)
{
buf[i] = toupper(buf[i]);
}
write(connectfd,buf,n);//not sizeof
}
else if(n == 0)
{
close(connectfd);
exit(0);
}
else if(n==-1)
{
perror("read");
}
}
}
}
多线程
#include <unistd.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <iostream>
using namespace std;
#include <arpa/inet.h>//sockaddr_in
#include <netinet/in.h>
#include <cstring>
#define SERVER_PORT 8888
int lfd,cfd;
struct sockaddr_in serveraddr,clientaddr;
char buf[BUFSIZ];
socklen_t addrlen;
pthread_t tid;
int ret,n,i;
void *thr_fun(void * arg)
{
ret = pthread_detach(pthread_self());
if(ret == -1)
{
perror("datach");
exit(1);
}
while(1)
{
n = read(cfd,buf,sizeof(buf));
if(n>0){
for(i=0;i<n;i++)
{
buf[i] = toupper(buf[i]);
}
write(cfd,buf,n);
}else if(n==0){
break;
}else{
perror("read");
exit(1);
}
}
close(cfd);
}
int main()
{
lfd = socket(AF_INET,SOCK_STREAM,0);
if(ret == -1){
perror("socket");
exit(1);
}
bzero(&serveraddr,sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(SERVER_PORT);
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
ret = bind(lfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr));
if(ret == -1){
perror("bind");
exit(1);
}
ret = listen(lfd,128);
if(ret == -1){
perror("listen");
exit(1);
}
while(1)
{
addrlen = sizeof(clientaddr);
cfd = accept(lfd,(struct sockaddr*)&clientaddr,&addrlen);
if(cfd == -1){
perror("accept");
exit(1);
}
ret = pthread_create(&tid,NULL,thr_fun,NULL);
if(ret != 0)
{
perror("pthread create");
exit(1);
}
}
close(lfd);
return 0;
}