TCPベースのマルチユーザサーバ
4271 ワード
1.マルチプロセスでマルチユーザの通信を実現
マルチプロセスバージョン:子プロセスの子プロセスである孫プロセスを使用します(子プロセスは親プロセスを待たないとゾンビプロセスになります).
2.マルチスレッドバージョン——新しいスレッドは要求を実行し、メインスレッドは戻って実行を継続する
マルチプロセスバージョン:子プロセスの子プロセスである孫プロセスを使用します(子プロセスは親プロセスを待たないとゾンビプロセスになります).
#include
#include
#include
#include
#include
#include
#include
#include
void CreatWorker(int client_fd,struct sockaddr_in* client)
{
pid_t id=fork();
if(id<0)
{
perror("fork");
return;
}
else if(id==0)//
{
if(fork()==0)//
{
char buf[1024]={0};
while(1)
{
ssize_t s=read(client_fd,buf,sizeof(buf));
if(s<0)
{
perror("read");
continue;
}
if(s==0)
{
printf("client close
");
close(client_fd);
break;
}
buf[s]='\0';
printf("client %s say :%s
",inet_ntoa(client->sin_addr),buf);
write(client_fd,buf,strlen(buf));
}
}
exit(0);
}
else
{
close(client_fd);
waitpid(id,NULL,0);
}
}
int main(int argc,char* argv[])
{
if(argc!=3)
{
printf("./server [ip] [port]
");
return 1;
}
struct sockaddr_in addr;
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=inet_addr(argv[1]);
addr.sin_port=htons(atoi(argv[2]));
int sock=socket(AF_INET,SOCK_STREAM,0);
if(sock<0)
{
perror("socket");
return 2;
}
int ret=bind(sock,(struct sockaddr*)&addr,sizeof(addr));
if(ret<0)
{
perror("bind");
return 3;
}
ret=listen(sock,10);
if(ret<0)
{
perror("listen");
return 4;
}
while(1)
{
struct sockaddr_in client;
socklen_t len=sizeof(client);
int client_fd=accept(sock,(struct sockaddr*)&client,&len);
if(client_fd<0)
{
perror("accept");
continue;
}
CreatWorker(client_fd,&client);
}
return 0;
}
2.マルチスレッドバージョン——新しいスレッドは要求を実行し、メインスレッドは戻って実行を継続する
#include
#include
#include
#include
#include
#include
#include
#include
#include
void Request(void* arg)
{
int client_fd=(int)arg;
char buf[1024]={0};
while(1)
{
ssize_t s=read(client_fd,buf,sizeof(buf));
if(s<0)
{
perror("read");
continue;
}
else if(s==0)
{
printf("client close
");
close(client_fd);
break;
}
buf[s]=0;
printf("client say %s
",buf);
write(client_fd,buf,strlen(buf));
}
close(client_fd);
return (void*)0;
}
int main(int argc,char* argv[])
{
if(argc!=3)
{
printf("./server [ip][port]
");
return 1;
}
struct sockaddr_in addr;
addr.sin_family=AF_INET;
addr.sin_port=htons(atoi(argv[2]));
addr.sin_addr.s_addr=inet_addr(argv[1]);
int sock=socket(AF_INET,SOCK_STREAM,0);
if(sock<0)
{
perror("sock");
return 1;
}
int ret=bind(sock,(struct sockaddr*)&addr,sizeof(addr));
if(ret<0)
{
perror("bind");
return 1;
}
ret=listen(sock,10);
if(ret<0)
{
perror("listen");
return 1;
}
while(1)
{
struct sockaddr_in client;
socklen_t len=sizeof(client);
int client_fd=accept(sock,(struct sockaddr*)&client,&len);
if(client_fd<0)
{
perror("accept");
continue;
}
pthread_t tid;
pthread_create(&tid,NULL,Request,(void*)client_fd);
pthread_detach(tid);
}
return 0;
}