rendered paste body#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#define MYPORT 12040#define BACKLOG 10#define BUFFER_SIZE 256using namespace std;int tcpip_bindsocket(char s_address[16], int s_port);void tcpip_listen(int socketfd, int backlog);int tcpip_accept(int socketfd);void tcpip_close(int socketfd);void server_mainlistener(int socketfd);void server_mainclienthandler(int socketfd);int tcpip_bindsocket(char s_address[16], int s_port){ int sockfd; int yes=1; struct sockaddr_in my_addr; if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) { perror("TCPIP Error: Failed to create socket"); exit(1); } if (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1) { perror("TCPIP Error: setsockopt failed"); exit(1); } my_addr.sin_family = AF_INET; my_addr.sin_addr.s_addr = inet_addr(s_address); my_addr.sin_port = htons(s_port); memset(&(my_addr.sin_zero), '\0', 8); if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) { perror("TCPIP Error: Can't bind to port"); exit(1); } return sockfd;}void tcpip_listen(int socketfd, int backlog){ if (listen(socketfd, backlog) == -1) { perror("TCPIP Error: Listen Failed"); exit(1); }}int tcpip_accept(int socketfd){ socklen_t sin_size; int new_fd; struct sockaddr_in their_addr; // connector's address information new_fd = accept(socketfd, (struct sockaddr *)&their_addr, &sin_size); return new_fd;}void tcpip_close(int socketfd){ close(socketfd);}void server_mainclienthandler(int socketfd){ send(socketfd, "Hello, world!\n", 14, 0);}void server_mainlistener(int socketfd){ socklen_t sin_size; int client_sockfd; struct sockaddr_in remoteaddr; // connector's address information fd_set master; // master file descriptor list fd_set read_fds; // temp file descriptor list for select() int fdmax; // maximum file descriptor number char buf[BUFFER_SIZE]; // buffer for client data int nbytes; socklen_t addrlen; int i, j; FD_ZERO(&master); // clear the master and temp sets FD_ZERO(&read_fds); FD_SET(socketfd, &master); fdmax = socketfd; while(1) { read_fds = master; if (select(fdmax+1, &read_fds, NULL, NULL, NULL) == -1) { perror("TCPIP Error: Select Failed"); exit(1); } for(i = 0; i <= fdmax; i++) { if (FD_ISSET(i, &read_fds)) { if (i == socketfd) { // handle new connections addrlen = sizeof(remoteaddr); if(client_sockfd = tcpip_accept(socketfd) == -1) { perror("TCPIP Error: Accept Failed"); } else { FD_SET(client_sockfd, &master); // add to master set if (client_sockfd > fdmax) { fdmax = client_sockfd; } printf("TCPIP: New connection from %s on: socket %d\n", inet_ntoa(remoteaddr.sin_addr), client_sockfd); } } else { // handle data from a client if ((nbytes = recv(i, buf, sizeof(buf), 0)) <= 0) { // got error or connection closed by client if (nbytes == 0) { // connection closed printf("TCPIP: Socket %d disconnected\n", i); } else { perror("TCPIP Error: Recieve error"); } close(i); // bye! FD_CLR(i, &master); // remove from master set } else { // client still connected server_mainclienthandler(i); } } } } }}main(){ int sockfd, new_fd; // listen on sock_fd, new connection on new_fd sockfd = tcpip_bindsocket("192.168.0.8",MYPORT); // open the socket tcpip_listen(sockfd,BACKLOG); // start listening server_mainlistener(sockfd); // run the main listener loop exit(1);}