echo_mpserv.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define BUF_SIZE 30
void error_handing(const char *message)
{
fputs(message,stderr);
fputc('\n',stderr);
exit(1);
}
void read_childproc(int sig)
{
int status;
pid_t pid = waitpid(-1,&status,WNOHANG);
if(WIFEXITED(status))
{
printf("Removed proc pid: %d \n", pid);
printf("Child send: %d \n",WEXITSTATUS(status) );
}
}
int main(int argc, char const *argv[])
{
if(argc != 2)
{
printf("Usage : %s <port>\n",argv[0] );
exit(1);
}
pid_t pid;
struct sigaction act;
act.sa_handler = read_childproc;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
int state = sigaction(SIGCHLD,&act,0);
int serv_fd = socket(PF_INET,SOCK_STREAM,0);
if (serv_fd == -1)
{
error_handing("socket() error");
}
struct sockaddr_in serv_addr;
memset(&serv_addr,0,sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(atoi(argv[1]));
if(bind(serv_fd,(struct sockaddr*)&serv_addr,sizeof(serv_addr)) == -1)
{
error_handing("bind() error");
}
if(listen(serv_fd,5) == -1)
{
error_handing("listen() error");
}
struct sockaddr_in clie_addr;
socklen_t clie_len = sizeof(clie_addr);
while(1)
{
memset(&clie_addr,0,sizeof(clie_len));
int clie_fd = accept(serv_fd,(struct sockaddr*)&clie_addr,&clie_len);
if(clie_fd == -1)
{
continue;
}else
{
puts("new client connected...");
}
pid = fork();
if(pid == -1)
{
close(clie_fd);
continue;
}else if(pid == 0)
{
close(serv_fd);
int str_len;
int buf[100];
memset(&buf,0,sizeof(buf));
while((str_len = read(clie_fd,buf,100)) != 0)
{
printf("Recv client length:%d\n",str_len );
write(clie_fd,buf,str_len);
// str_len = read(clie_fd,buf,100);
}
close(clie_fd);
puts("client disconnected...");
return 0;
}else
{
close(clie_fd);
}
}
close(serv_fd);
return 0;
}
echo_mpclient.c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define BUF_SIZE 30
void error_handing(const char *message)
{
fputs(message,stderr);
fputc('\n',stderr);
exit(1);
}
void read_routine(int sock,char* buf);
void write_routine(int sock,char* buf);
int main(int argc, char const *argv[])
{
if (argc != 3)
{
printf("Usage : %s <IP> <port>\n",argv[0] );
exit(1);
}
int cfd = socket(PF_INET,SOCK_STREAM,0);
if(cfd == -1)
{
error_handing("socket() error");
}
struct sockaddr_in clie_addr;
memset(&clie_addr,0,sizeof(clie_addr));
clie_addr.sin_family = AF_INET;
clie_addr.sin_addr.s_addr = inet_addr(argv[1]);
clie_addr.sin_port = htons(atoi(argv[2]));
if(connect(cfd,(struct sockaddr*)&clie_addr,sizeof(clie_addr)) == -1)
{
error_handing("connect() error");
}
int pid = fork();
char buf[BUF_SIZE];
memset(&buf,0,sizeof(buf));
if(pid == 0)
{
write_routine(cfd,buf);
}else
{
read_routine(cfd,buf);
}
close(cfd);
return 0;
}
void read_routine(int cfd,char* buf)
{
while(1)
{
int str_len = read(cfd,buf,BUF_SIZE);
printf("Recv server %d\n",str_len );
if (str_len == 0)
return;
buf[str_len] = 0;
printf("Message from server: %s\n",buf );
}
}
void write_routine(int cfd,char* buf)
{
while(1)
{
fgets(buf,BUF_SIZE,stdin);
if(!strcmp(buf,"q\n") || !strcmp(buf,"Q\n"))
{
shutdown(cfd,SHUT_WR);
return;
}
printf("client send: %s\n",buf );
write(cfd,buf,strlen(buf));
}
}