#include #include #include #include #include #include #include #include #define CON_NUM 10 #define MAX_IPV4_SIZE 15 int main(int argc, char** argv) { int sockfd, new_fd; struct addrinfo hints, *servinfo; struct sockaddr_in their_addr; socklen_t sin_size; char *buff = (char*)malloc(1024); char ip[MAX_IPV4_SIZE]; int rc; memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_PASSIVE; if (argc != 2) { printf("Usage : %s PORT\n", argv[0]); return -1; } if ((rc = getaddrinfo(NULL, argv[1], &hints, &servinfo)) != 0) { printf("Error at getaddrinfo() : %s\n", gai_strerror(rc)); return 1; } if ((sockfd = socket(servinfo->ai_family, servinfo->ai_socktype, servinfo->ai_protocol)) == -1) { printf("Error at socket() : %s\n", strerror(errno)); freeaddrinfo(servinfo); return 1; } if (bind(sockfd, servinfo->ai_addr, servinfo->ai_addrlen) == -1) { printf("Error at bind() : %s\n", strerror(errno)); freeaddrinfo(servinfo); close(sockfd); return -1; } if (listen(sockfd, CON_NUM) == -1) { printf("Error at listen() : %s\n", strerror(errno)); freeaddrinfo(servinfo); close(sockfd); return -1; } sin_size = sizeof their_addr; while(1) { new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size); if (new_fd == -1) { printf("Error at accept() : %s\n", strerror(errno)); continue; } inet_ntop(their_addr.sin_family, (struct sockaddr*)&their_addr.sin_addr, ip, sizeof ip); printf("Got connection from %s\n", ip); int j = 1; while (1) { j = recv(new_fd, buff, 1024, 0); if ( j == 0 ) break; if ( j == -1 ) { printf("Error at recv() : %s\n", strerror(errno)); freeaddrinfo(servinfo); close(sockfd); return -1; } printf("Recieved : %s\n", buff); } } freeaddrinfo(servinfo); close(sockfd); close(new_fd); return 0; }