tcp socket 回射服务器.

#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include<stdlib.h>
#include<errno.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<string.h>
#include<signal.h>
#include <sys/wait.h>

#define MAXLINE 1024
#define ERR_EXIT(m)     do {  perror(m);   exit(EXIT_FAILURE); } while (0)

void do_service(int connfd)
{
	char recvbuf[MAXLINE];
	printf("###creat new thread####\n");
	while(1)
	{
		memset(recvbuf,0,sizeof(recvbuf));
		printf("wait for client send data: \n");
		int ret = recv(connfd, recvbuf, MAXLINE, 0);
		//int ret = read(connfd, recvbuf, sizeof(recvbuf));
		if (ret == 0)
		{
			printf("client close\n");
			break;
		}else if(ret == -1){
			ERR_EXIT("read error");
		}
		printf("####connfd: %d\n", connfd);
 		printf("recv msg from client: %s\n", recvbuf);

 		//send msg to client
 		printf("send ack to client###\n");
 		//write(connfd,  "###server receive ok###", strlen(sendbuf));
 		send(connfd, "###server receive ok###", MAXLINE, 0 );

 		if (strcmp(recvbuf,"quit") == 0)
 		{
 			printf("child process shutdown\n");
 			break;
 		}
	}
	close(connfd);
}

void str_echo(int connfd)
{
	int n ;
	char buf[MAXLINE];
	
	again:
	    while ((n = read(connfd,buf,MAXLINE))>0){
	    	//send data to client
	    	printf("send data to client\n");
			write(connfd,  buf, n);
	    }
		
		if(n <0 && errno == EINTR)
		{
			ERR_EXIT("str_echo :again");
			goto again;
		}
		else if(n<0)
			ERR_EXIT("str_echo : read error");
	
}

void sig_chld(int signo)
{
	pid_t pid;
	int stat;
	//pid = wait(&stat);
	while((pid = waitpid(-1, &stat, WNOHANG)) >0)
		printf("child %d terminated\n",pid);
	return;
}

int main(int argc, char **argv)
{
	int listenfd, connfd;

	if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
	{
		ERR_EXIT("socket error");
	}

	struct sockaddr_in servadd;
	memset(&servadd, 0, sizeof(servadd));

	servadd.sin_family = AF_INET;
	servadd.sin_port = htons(49160);
	servadd.sin_addr.s_addr = htonl(INADDR_ANY);
	//if((inet_pton(AF_INET, "127.0.0.1", &servadd.sin_addr))<0)
	//	ERR_EXIT("inet_pton error");

	if (bind(listenfd, (struct sockaddr *)&servadd, sizeof(servadd))<0)
	{
		ERR_EXIT("bind error");
	}

	if (listen(listenfd, SOMAXCONN) < 0)
	{
		ERR_EXIT("listen error");
	}
    signal(SIGCHLD, sig_chld);
	//传出参数
	struct sockaddr_in peeraddr;
	socklen_t peerlen = sizeof(peeraddr);
	pid_t pid;

	while(1)
	{
		printf("wait new client to connect.....\n");
		if ((connfd = accept(listenfd, (struct sockaddr *)&peeraddr, &peerlen)) < 0)
		{
			if(errno == EINTR){
				printf("server continue\n");
				continue;
			}else{
				ERR_EXIT("accept error");
			}
		}
		printf("recv connect ip=%s, port=%d, connect:%d\n", inet_ntoa(peeraddr.sin_addr), ntohs(peeraddr.sin_port), connfd);
		pid = fork();
		if (pid == -1){
			ERR_EXIT("fork error");
		}else if (pid == 0)
		{
			//子进程
			close(listenfd);
			//do_service(connfd);
			str_echo(connfd);
			exit(EXIT_SUCCESS);
		}else{
			close(connfd);
		}
	} 
	return 0;
}
发布了77 篇原创文章 · 获赞 6 · 访问量 9334

猜你喜欢

转载自blog.csdn.net/ding283595861/article/details/104429310
今日推荐