/*************************本代码还有一定的问题需要研究***********************/
#include <stdio.h>
#include <signal.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <strings.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#define N 64
void handler(int signo)
{
pid_t pid;
while ((pid = waitpid(-1, NULL, WNOHANG)) > 0)
printf("child %d terminate\n", pid);
}
int main(int argc, char *argv[])
{
//./server 192.168.1.240 9000
int sockfd, connfd;
struct sockaddr_in myaddr, peeraddr;
socklen_t len;
char buf[N] = {0};
ssize_t n;
pid_t pid;
if (argc < 3)
{
printf("usage:%s ip port\n", argv[0]);
exit(0);
}
if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket");
exit(-1);
}
bzero(&myaddr, sizeof(myaddr));
myaddr.sin_family = PF_INET;
myaddr.sin_port=htons(atoi(argv[2]));//htons(6000)
myaddr.sin_addr.s_addr=inet_addr(argv[1]);
if (bind(sockfd,(struct sockaddr *)&myaddr, sizeof(myaddr)) == -1)
{
perror("bind");
exit(-1);
}
if (listen(sockfd, 5) == -1)
{
perror("listen");
exit(-1);
}
bzero(&peeraddr, sizeof(peeraddr));
len = sizeof(peeraddr);
signal(SIGCHLD, handler);
while (1)
{
if ((connfd = accept(sockfd, (struct sockaddr *)&peeraddr, &len)) == -1)
{
perror("accept");
exit(-1);
}
printf("welcome %d\n", ntohs(peeraddr.sin_port));
if ((pid = fork()) == -1)
{
perror("fork");
exit(-1);
}
if (pid == 0)
{
close(sockfd);
/*****************exit 退出后系统会自动关闭文件描述符*******************/
struct timeval tv={5,0};
if(-1==setsockopt(connfd,SOL_SOCKET,SO_RCVTIMEO,&tv,sizeof(tv)))
break;
while (1)
{
bzero(buf, sizeof(buf));
//struct timeval tv={5,0};
//if(-1==setsockopt(connfd,SOL_SOCKET,SO_RCVTIMEO,&tv,sizeof(tv)))
// break;
n = recv(connfd, buf, N, 0);
if (n == 0)
break;
buf[n] = 0;
printf("n = %d: %s\n", n, buf);
send(connfd, buf, n, 0);
}
exit(0);
}
else
{
close(connfd);
}
}
exit(0);
}