#include<stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <signal.h>
#include<stdlib.h>
#include <fcntl.h>
#define SERVER_PORT 8888
int pipefd[2]={0,0};
char g_msg[1000];
void SigHandler(int sig)
{
char cMsfBuf[500]={""};
ssize_t ret;
ret = read(pipefd[0],cMsfBuf ,sizeof(cMsfBuf)-1);
if(ret >0)
{
strcat(g_msg , cMsfBuf);
printf("saved msg :\n %s by SigHandler \n \n ",g_msg);
}
}
int main(int argc, char **argv)
{
int fd;
struct sockaddr_in tSockServerAddr;
int ret;
struct sockaddr_in tSockClientAddr;
int new_fd;
int iClientlen;
int iRecvLen;
unsigned char ucRecvBuf[1000];
int piperet;
piperet = pipe(pipefd);
if (piperet == -1)
{
printf("pipe err \n");
return -1;
}
signal(SIGCHLD,SIG_IGN);
fd = socket(AF_INET,SOCK_STREAM,0);
if (fd == -1)
{
printf("socket err \n");
return -1;
}
else
printf("socket fd = %d \n",fd);
tSockServerAddr.sin_family = AF_INET;
tSockServerAddr.sin_port = htons(SERVER_PORT);
tSockServerAddr.sin_addr.s_addr = INADDR_ANY;
memset(tSockServerAddr.sin_zero , 0 , 8);
ret = bind(fd, (const struct sockaddr *)&tSockServerAddr, sizeof(struct sockaddr));
printf("bind ret = %d\n",ret);
ret =listen(fd , 10);
printf("listen ret = %d\n",ret);
while(1)
{
iClientlen = sizeof(struct sockaddr) ;
new_fd = accept(fd ,( struct sockaddr *)&tSockClientAddr, &iClientlen);
if( new_fd == -1)
{
printf("accept err \n");
return -1;
}
printf("accept connect from: %s \n",inet_ntoa(tSockClientAddr.sin_addr));
if(!fork()) {
close(pipefd[0]);//not read
while (1){
iRecvLen = recv(new_fd , ucRecvBuf , 999 ,0);
if(iRecvLen <= 0){
printf("receive len <= 0 \n");
close(new_fd);
return -1;
}
else{
ucRecvBuf[iRecvLen] ='\0' ;
write(pipefd[1], ucRecvBuf , strlen(ucRecvBuf));
printf("get msg about : %s \n",ucRecvBuf);
printf(" msg in son progress is : [%s ]\n",g_msg);
}
}
}
else{
close(pipefd[1]);//not write
int flags;
signal(SIGIO, SigHandler);
fcntl(pipefd[0] , __F_SETOWN ,getpid() );
flags = fcntl(pipefd[0] , F_GETFL);
fcntl(pipefd[0] , F_SETFL , flags | O_ASYNC );
printf("main process \n");
}
close(new_fd);
}
close(fd);
return 0;
}
/*
struct sigaction sigAct;
sigAct.sa_flags = SA_SIGINFO ;
sigAct.sa_sigaction = SigHandler ;
if(sigaction(SIGUSR1, &sigAct, NULL) == -1)
{
printf("sigaction err \n");
return -1;
}
sigval_t val;
char pMsg[] = "hello sig";
val.sival_ptr = pMsg;
if(sigqueue(getpid(),SIGUSR1,val) == -1)
{
printf("sigqueue err \n");
return -1;
}
*/
评论0