multiPID.c
#include<myhead.h>
#define PORT 8888
#define IP "192.168.0.154"
#define LISTENSIZE 10
void handler(int key)
{
if(key == SIGCHLD)
{
//9.waitpid
while(waitpid(-1,NULL,WNOHANG)!=-1);
}
}
int main(int argc, const char *argv[])
{
if(signal(SIGCHLD,handler)==SIG_ERR)
{
perror("signal");
return -1;
}
//1.socket
int oldsocket = socket(AF_INET,SOCK_STREAM,0);
if(oldsocket == -1)
{
perror("oldsocket");
return -1;
}
//2.setsockopt
int k =9;
if(setsockopt(oldsocket,SOL_SOCKET,SO_REUSEADDR,&k,sizeof(k))==-1)
{
perror("setsockopt");
return -1;
}
struct sockaddr_in sln =
{
.sin_family = AF_INET,
.sin_port = htons(PORT),
.sin_addr = inet_addr(IP),
};
//3.bind
if(bind(oldsocket,(struct sockaddr*)&sln,sizeof(sln))==-1)
{
perror("bind");
return -1;
}
//4.listen
if(listen(oldsocket,LISTENSIZE)==-1)
{
perror("listen");
return -1;
}
printf("listen success\n");
struct sockaddr_in cln;
int clnlen =sizeof(cln);
int newsocket;
char buff[1024]="";
while(1)
{
//5.accept
newsocket=accept(oldsocket,(struct sockaddr*)&cln,&clnlen);
if(newsocket==-1)
{
perror("accept");
return -1;
}
printf("%s:%d发来请求\n",inet_ntoa(cln.sin_addr),ntohs(cln.sin_port));
//6.fork
pid_t pid = fork();
if(pid>0)
{
close(newsocket);
}
else if(pid==0)
{
close(oldsocket);
//7,recv
while(1){
memset(buff,0,sizeof(buff));
int len = recv(newsocket,buff,sizeof(buff),0);
if(len==0)
{
printf("客户端退出\n");
break;
}
printf("%s:%d发来消息%s\n",inet_ntoa(cln.sin_addr),ntohs(cln.sin_port),buff);
strcat(buff,"666");
buff[strlen(buff)-1]='\0';
send(newsocket,buff,sizeof(buff),0);
printf("转发成功\n");
}
//10.close
// close(newsocket);
//8.signal
exit(EXIT_SUCCESS);
}
else
{
perror("fork");
return -1;
}
}
close(oldsocket);
return 0;
}
multiTID.c
#include<myhead.h>
#define PORT 8888
#define IP "192.168.0.154"
#define LISTENSIZE 10
typedef struct
{
int newsocket;
struct sockaddr_in cln;
}client;
void *communication(void * arg)
{
client *cln = (client *)arg;
char buff[1024];
while(1)
{
memset(buff,0,sizeof(buff));
int len = recv(cln->newsocket,buff,sizeof(buff),0);
if(len==0)
{
printf("客户端退出\n");
break;
}
printf("%s:%d发来消息%s\n",
inet_ntoa(cln->cln.sin_addr),ntohs(cln->cln.sin_port),buff);
strcat(buff,"666");
buff[strlen(buff)-1]='\0';
send(cln->newsocket,buff,sizeof(buff),0);
printf("转发成功\n");
}
//7,pthread_exit
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
//1.socket
int oldsocket = socket(AF_INET,SOCK_STREAM,0);
if(oldsocket == -1)
{
perror("oldsocket");
return -1;
}
//2.setsockopt
int k =9;
if(setsockopt(oldsocket,SOL_SOCKET,SO_REUSEADDR,&k,sizeof(k))==-1)
{
perror("setsockopt");
return -1;
}
struct sockaddr_in sln =
{
.sin_family = AF_INET,
.sin_port = htons(PORT),
.sin_addr = inet_addr(IP),
};
//3.bind
if(bind(oldsocket,(struct sockaddr*)&sln,sizeof(sln))==-1)
{
perror("bind");
return -1;
}
//4.listen
if(listen(oldsocket,LISTENSIZE)==-1)
{
perror("listen");
return -1;
}
printf("listen success\n");
struct sockaddr_in cln;
int clnlen =sizeof(cln);
int newsocket;
char buff[1024]="";
while(1){
//5.accept
newsocket=accept(oldsocket,(struct sockaddr*)&cln,&clnlen);
if(newsocket==-1)
{
perror("accept");
return -1;
}
printf("%s:%d发来请求\n",inet_ntoa(cln.sin_addr),ntohs(cln.sin_port));
client clninfo;
clninfo.newsocket =newsocket;
clninfo.cln = cln;
//6.pthread_create
pthread_t tid;//定义线程
if(pthread_create(&tid,NULL,communication,&clninfo)!=0)
{
perror("pthread_create");
return -1;
}
//8.pthread_detach
pthread_detach(tid);
//9.close
//close(newsocket);
}
close(oldsocket);
return 0;
}