#include #include #include #include #include #include #include #include #define BUFFER_SIZE 1024 char *msg = "ack"; int main() { char buffer[ BUFFER_SIZE ]; int sock, newsock, len, fromlen, n, pid; /* socket structures from /usr/include/sys/socket.h */ struct sockaddr_in server; struct sockaddr_in client; unsigned short port = 8127; /* Create the listener socket as TCP socket */ /* (use SOCK_DGRAM for UDP) */ sock = socket( PF_INET, SOCK_STREAM, 0 ); if ( sock < 0 ) { perror( "socket()" ); exit( 1 ); } server.sin_family = PF_INET; server.sin_addr.s_addr = INADDR_ANY; /* htons() is host-to-network-short for marshalling */ /* Internet is "big endian"; Intel is "little endian" */ server.sin_port = htons( port ); len = sizeof( server ); if ( bind( sock, (struct sockaddr *)&server, len ) < 0 ) { perror( "bind()" ); exit( 1 ); } fromlen = sizeof( client ); listen( sock, 5 ); /* 5 is number of backlogged waiting clients */ printf( "Listener socket created and bound to port %d\n", port ); while ( 1 ) { printf( "Blocked on accept()\n" ); newsock = accept( sock, (struct sockaddr *)&client, &fromlen ); printf( "Accepted client connection\n" ); fflush( NULL ); /* handle socket in child process */ pid = fork(); if ( pid == 0 ) { /* can also use read() and write() */ n = recv( newsock, buffer, BUFFER_SIZE - 1, 0 ); if ( n < 1 ) { perror( "recv()" ); } else { buffer[n] = '\0'; printf( "Received message from %s: %s\n", inet_ntoa( (struct in_addr)client.sin_addr ), buffer ); } n = send( newsock, msg, strlen( msg ), 0 ); if ( n < strlen( msg ) ) { perror( "Write()" ); } close( newsock ); exit( 0 ); /* child process becomes a zombie... */ } /* parent simply closes the socket */ close( newsock ); } return 0; /* we never get here */ }