#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;
}
tcp socket 回射服务器.
猜你喜欢
转载自blog.csdn.net/ding283595861/article/details/104429310
今日推荐
周排行