#include /* basic system data types */ #include /* basic socket definitions */ #include #include #include #include #include #define MAXLINE 1024 #define LISTENQ 16 /* max size of queue */ ssize_t readline(int fd, void *vptr, size_t maxlen) { int n, rc; char c, *ptr; ptr = vptr; for (n = 1; n < maxlen; n++) { if ( (rc = read(fd, &c, 1)) == 1) { *ptr++ = c; if (c == '\n') break; /* newline is stored, like fgets() */ } else if (rc == 0) { if (n == 1) return(0); /* EOF, no data read */ else break; /* EOF, some data was read */ } else return(-1); /* error, errno set by read() */ } *ptr = 0; /* null terminate like fgets() */ return(n); } /* end readline */ void str_echo(int sockfd) { ssize_t n; char line[MAXLINE]; for ( ; ; ) { if ( (n = readline(sockfd, line, MAXLINE)) == 0) return; /* connection closed by other end */ write(sockfd, line, n); } } /* end str_echo */ int main(int argc, char **argv) { int listenfd, connfd; // pid_t childpid; int clilen; struct sockaddr_in cliaddr, servaddr; listenfd = socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(6789); if(bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr))) { printf("Bind failed.\n"); // exit(-1); } if (listen(listenfd, LISTENQ) == -1) { printf("Listen failed\n"); // exit(-1); } for ( ; ; ) { clilen = sizeof(cliaddr); connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &clilen); str_echo(connfd); /* process the request */ close(connfd); /* close connected socket */ } } /* end main */