/* ** servereph.c ** Written by Wei YIN, 20 August 2009. ** before running change the parameter in gethostbyname() ** ** Compile with "gcc -o servereph servereph.c" */ #include #include #include #include #include #include #include #include #define MAXSOCKADDR 128 void capitalise(char* str) { while(*str) { *str = (char)toupper((int)*str); str++; } } int main() { int fdServer; struct sockaddr_in serverAddr; struct sockaddr_in serverAddr2; socklen_t len = MAXSOCKADDR;//must be initialized struct hostent* hostp; struct in_addr* ipAddress; hostp = gethostbyname("moss");// use name of your host ipAddress = (struct in_addr*)hostp->h_addr_list[0]; fdServer = socket(AF_INET, SOCK_STREAM, 0); serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(0); // system will allocate port number serverAddr.sin_addr.s_addr = ipAddress->s_addr; // IP address not htonl(INADDR_ANY) /* Bind socket to a given address */ if(bind(fdServer, (struct sockaddr*)&serverAddr, sizeof(struct sockaddr_in))!=0){ printf("bind error\n"); return 1; } //get the ip addr and port number allocated by the system if(getsockname(fdServer,(struct sockaddr*)&serverAddr2,&len)== 0) { printf("the port number is %d\n",htons(serverAddr2.sin_port)); printf("ip address is %s\n",inet_ntoa(serverAddr2.sin_addr)); } else printf("getsocketname return error\n"); /* Start listening on the socket */ listen(fdServer, SOMAXCONN); /* Accept connections, one after the other */ while(1) { int fd; struct sockaddr_in fromAddr; int fromAddrSize; struct hostent* hp; FILE* connStreamIn; FILE* connStreamOut; char buffer[1024]; fromAddrSize = sizeof(struct sockaddr_in); fd = accept(fdServer, (struct sockaddr*)&fromAddr, &fromAddrSize); /* Find out where the connection came from */ hp=gethostbyaddr((char*)&fromAddr.sin_addr.s_addr, sizeof(fromAddr.sin_addr.s_addr), AF_INET); printf("Connection accepted from %s port %d\n", hp->h_name, ntohs(fromAddr.sin_port)); connStreamIn = fdopen(fd, "r"); connStreamOut = fdopen(fd, "w"); while(fgets(buffer, 1024, connStreamIn)) { if(strcmp(buffer,"Bye\n") == 0) { break; } capitalise(buffer); fprintf(connStreamOut, "%s", buffer); fflush(connStreamOut); } printf("Finishing up ...\n"); fflush(stdout); fclose(connStreamIn); fclose(connStreamOut); } }