#include #include #include #include #include #include #define MAXPENDING 5 /* Maximum outstanding connection requests */ int main(int argc, char *argv[]) { int servSock; /* Socket descriptor for server */ int clntSock; /* Socket descriptor for client */ struct sockaddr_in echoServAddr; /* Local address */ struct sockaddr_in echoClntAddr; /* Client address */ unsigned short echoServPort; /* Server port */ unsigned int clntLen; /* Length of client address data structure */ if (argc != 2) { fprintf(stderr, "Usage: %s \n", argv[0]); exit(1); } echoServPort = atoi(argv[1]); /* First arg: local port */ /* Create socket for incoming connections */ if ((servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { printf("socket() failed\n"); exit(1); } /* Construct local address structure */ memset(&echoServAddr, 0, sizeof(echoServAddr)); /* Zero out structure */ echoServAddr.sin_family = AF_INET; /* Internet address family */ echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY); /* Any incoming interface */ echoServAddr.sin_port = htons(echoServPort); /* Local port */ /* Bind to the local address */ if (bind(servSock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0) { printf("bind() failed\n"); exit(1); } /* Mark the socket so it will listen for incoming connections */ if (listen(servSock, MAXPENDING) < 0) { printf("listen() failed\n"); exit(1); } for (;;) { /* Set the size of the in-out parameter */ clntLen = sizeof(echoClntAddr); /* Wait for a client to connect */ if ((clntSock = accept(servSock, (struct sockaddr *) &echoClntAddr, &clntLen)) < 0) { printf("accept() failed\n"); exit(1); } printf("Handling client %s\n", inet_ntoa(echoClntAddr.sin_addr)); char echoBuffer[80]; int bytes_recv = recv(clntSock, echoBuffer, 80, 0); printf("%d bytes received\n", bytes_recv); send(clntSock, echoBuffer, bytes_recv, 0); close(clntSock); } }