服务端
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define PORT 8888
#define IP "127.0.0.1"
void catch_SIGCHLD ( int signum) {
int waitret;
while ( ( waitret = waitpid ( - 1 , NULL , WNOHANG) ) > 0 ) ;
printf ( "cleaned %d\n" , waitret) ;
return ;
}
int main ( ) {
int sfd = socket ( AF_INET, SOCK_STREAM, 0 ) ;
if ( sfd == - 1 ) {
perror ( "socket error" ) ;
exit ( 1 ) ;
}
struct sockaddr_in serv_addr;
socklen_t serv_len;
serv_addr. sin_family = AF_INET;
serv_addr. sin_port = htons ( PORT) ;
inet_pton ( AF_INET, IP, & serv_addr. sin_addr. s_addr) ;
serv_len = sizeof ( serv_addr) ;
int ret = bind ( sfd, ( struct sockaddr* ) & serv_addr, serv_len) ;
if ( ret == - 1 ) {
perror ( "bind error" ) ;
exit ( 2 ) ;
}
ret = listen ( sfd, 128 ) ;
if ( ret == - 1 ) {
perror ( "listen error" ) ;
exit ( 3 ) ;
}
struct sockaddr_in clie_addr;
int cfd;
pid_t pid;
while ( 1 ) {
socklen_t clie_len = sizeof ( clie_addr) ;
cfd = accept ( sfd, ( struct sockaddr* ) & clie_addr, & clie_len) ;
pid = fork ( ) ;
if ( pid == - 1 ) {
perror ( "fork error" ) ;
exit ( 4 ) ;
} else if ( pid == 0 ) {
close ( sfd) ;
break ;
} else {
close ( cfd) ;
struct sigaction act;
act. sa_handler = catch_SIGCHLD;
sigemptyset ( & act. sa_mask) ;
act. sa_flags = 0 ;
ret = sigaction ( SIGCHLD, & act, NULL ) ;
if ( ret == - 1 ) {
perror ( "sigaction error" ) ;
exit ( 5 ) ;
}
}
}
char buf[ BUFSIZ] ;
int len, i;
while ( 1 ) {
len = read ( cfd, buf, sizeof ( buf) ) ;
for ( i = 0 ; i < len; i++ ) {
buf[ i] = toupper ( buf[ i] ) ;
}
write ( cfd, buf, strlen ( buf) ) ;
}
return 0 ;
}