#include<myhead.h>
#define SERIP "192.168.0.161"
#define SERPORT 9999
#define listensize 10
void handler(int bbb)
{
if(bbb==SIGCHLD)
{
//7.wait
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 = 1;
if(setsockopt(oldsocket,SOL_SOCKET,SO_REUSEADDR,&k,sizeof(k))==-1)
{
perror("setsockopt");
return -1;
}
printf("设置端口快速复用成功\n");
//3.bind
struct sockaddr_in sln={
.sin_family = AF_INET,
.sin_addr = inet_addr(SERIP),
.sin_port = htons(SERPORT),
};
if(bind(oldsocket,(struct sockaddr*)&sln,sizeof(sln))==-1)
{
perror("bind");
return -1;
}
//4.listen
if(listen(oldsocket,listensize)==-1)
{
perror("listen");
return -1;
}
//5.accpect in circle
struct sockaddr_in cln;
int clnlen = sizeof(cln);
while(1)
{
//5.1 accept
int newsocket = accept(oldsocket,(struct sockaddr*)&cln,&clnlen);
if(newsocket==-1)
{
perror("accpect");
return -1;
}
printf("newsocket=%d\n",newsocket);
printf("%s:%d发来连接请求\n",inet_ntoa(cln.sin_addr),ntohs(cln.sin_port));
//5.2 fork
pid_t pid;
pid = fork();
if(pid>0)
{
close(newsocket);
}
else if(pid == 0)
{
char buff[1024];
while(1){
//6.recv send
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,"1234");
send(newsocket,buff,sizeof(buff),0);
printf("发送成功\n");
}
exit(EXIT_SUCCESS);
// close(newsocket);
}
else
{
perror("fork");
return -1;
}
}
//8.close
close(oldsocket);
return 0;
}