Copy //server.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <errno.h>
#include <error.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <string.h>
#include <signal.h>
#include <sys/wait.h>
typedef void sigfunc(int);
void func_wait(int signo) {
pid_t pid;
int stat;
pid = wait(&stat);
printf( "child %d exit\n", pid );
return;
}
void func_waitpid(int signo) {
pid_t pid;
int stat;
while( (pid = waitpid(-1, &stat, WNOHANG)) > 0 ) {
printf( "child %d exit\n", pid );
}
return;
}
sigfunc* signal( int signo, sigfunc *func ) {
struct sigaction act, oact;
act.sa_handler = func;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
if ( signo == SIGALRM ) {
#ifdef SA_INTERRUPT
act.sa_flags |= SA_INTERRUPT; /* SunOS 4.x */
#endif
} else {
#ifdef SA_RESTART
act.sa_flags |= SA_RESTART; /* SVR4, 4.4BSD */
#endif
}
if ( sigaction(signo, &act, &oact) < 0 ) {
return SIG_ERR;
}
return oact.sa_handler;
}
void str_echo( int cfd ) {
ssize_t n;
char buf[1024];
again:
memset(buf, 0, sizeof(buf));
while( (n = read(cfd, buf, 1024)) > 0 ) {
write(cfd, buf, n);
}
if( n <0 && errno == EINTR ) {
goto again;
} else {
printf("str_echo: read error\n");
}
}
int main() {
signal(SIGCHLD, &func_waitpid);
int s, c;
pid_t child;
if( (s = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) {
int e = errno;
perror("create socket fail.\n");
exit(0);
}
struct sockaddr_in server_addr, child_addr;
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(9998);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if( bind(s, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0 ) {
int e = errno;
perror("bind address fail.\n");
exit(0);
}
if( listen(s, 1024) < 0 ) {
int e = errno;
perror("listen fail.\n");
exit(0);
}
while(1) {
socklen_t chilen = sizeof(child_addr);
if ( (c = accept(s, (struct sockaddr *)&child_addr, &chilen)) < 0 ) {
perror("listen fail.");
exit(0);
}
if( (child = fork()) == 0 ) {
close(s);
str_echo(c);
exit(0);
}
close(c);
}
}
//client.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <errno.h>
#include <error.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <string.h>
#include <signal.h>
void str_cli(FILE *fp, int sfd ) {
char sendline[1024], recvline[2014];
memset(recvline, 0, sizeof(sendline));
memset(sendline, 0, sizeof(recvline));
while( fgets(sendline, 1024, fp) != NULL ) {
write(sfd, sendline, strlen(sendline));
if( read(sfd, recvline, 1024) == 0 ) {
printf("server term prematurely.\n");
}
fputs(recvline, stdout);
memset(recvline, 0, sizeof(sendline));
memset(sendline, 0, sizeof(recvline));
}
}
int main() {
int s[5];
for (int i=0; i<5; i++) {
if( (s[i] = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) {
int e = errno;
perror("create socket fail.\n");
exit(0);
}
}
for (int i=0; i<5; i++) {
struct sockaddr_in server_addr, child_addr;
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(9998);
inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr);
if( connect(s[i], (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0 ) {
perror("connect fail.");
exit(0);
}
}
sleep(10);
str_cli(stdin, s[0]);
exit(0);
}