#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define BUFSIZE 1024
#if 0
struct in_addr {
unsigned int s_addr;
};
struct sockaddr_in {
unsigned short int sin_family;
unsigned short int sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[...];
};
struct hostent {
char *h_name;
char **h_aliases;
int h_addrtype;
int h_length;
char **h_addr_list;
}
#endif
void error(char *msg) {
perror(msg);
exit(1);
}
int main(int argc, char **argv) {
int listenfd;
int connfd;
int portno;
int clientlen;
struct sockaddr_in serveraddr;
struct sockaddr_in clientaddr;
struct hostent *hostp;
char buf[BUFSIZE];
char *hostaddrp;
int optval;
int n;
if (argc != 2) {
fprintf(stderr, "usage: %s <port>\n", argv[0]);
exit(1);
}
portno = atoi(argv[1]);
int mypid = getpid();
printf( "y pid is %d\n", mypid );
listenfd = socket(AF_INET, SOCK_STREAM, 0);
if (listenfd < 0)
error("ERROR opening socket");
optval = 1;
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR,
(const void *)&optval , sizeof(int));
bzero((char *) &serveraddr, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
serveraddr.sin_port = htons((unsigned short)portno);
if (bind(listenfd, (struct sockaddr *) &serveraddr,
sizeof(serveraddr)) < 0)
error("ERROR on binding");
if (listen(listenfd, 5) < 0)
error("ERROR on listen");
clientlen = sizeof(clientaddr);
while (1) {
connfd = accept(listenfd, (struct sockaddr *) &clientaddr, &clientlen);
if (connfd < 0)
error("ERROR on accept");
hostp = gethostbyaddr((const char *)&clientaddr.sin_addr.s_addr,
sizeof(clientaddr.sin_addr.s_addr), AF_INET);
if (ho