/* simple-server.c * * Copyright (c) 2000 Sean Walton and Macmillan Publishers. Use may be in * whole or in part in accordance to the General Public License (GPL). * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /*****************************************************************************/ /*** simple-server.c ***/ /*** ***/ /*****************************************************************************/ /************************************************************************** * This is a simple echo server. This demonstrates the steps to set up * a streaming server. **************************************************************************/ #include #include #include /* #include */ #include #include #define MY_PORT 9999 #define MAXBUF 1024 int main(int Count, char *Strings[]) { int sockfd; struct sockaddr_in self; char buffer[MAXBUF]; /*---Create streaming socket---*/ if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) { perror("Socket"); exit(errno); } printf("Socket created...\n"); /*---Initialize address/port structure---*/ bzero(&self, sizeof(self)); self.sin_family = AF_INET; self.sin_port = htons(MY_PORT); self.sin_addr.s_addr = INADDR_ANY; /*---Assign a port number to the socket---*/ if ( bind(sockfd, (struct sockaddr*)&self, sizeof(self)) != 0 ) { perror("socket--bind"); exit(errno); } printf("socket bound to %s:%d ...\n", inet_ntoa(self.sin_addr), ntohs(self.sin_port)); /*---Make it a "listening socket"---*/ if ( listen(sockfd, 20) != 0 ) { perror("socket--listen"); exit(errno); } printf("listening on server socket ...\n"); /*---Forever... ---*/ while (1) { int clientfd; struct sockaddr_in client_addr; int addrlen=sizeof(client_addr); /*---accept a connection (creating a data pipe)---*/ printf("ready to accept incoming connections ...\n"); clientfd = accept(sockfd, (struct sockaddr*)&client_addr, &addrlen); printf("%s:%d accepted\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); /*---Echo back anything sent---*/ printf("waiting for data ...\n"); send(clientfd, buffer, recv(clientfd, buffer, MAXBUF, 0), 0); printf("replied; going to close socket ...\n"); /*---Close data connection---*/ close(clientfd); printf("client socket closed.\n\n\n"); } /*---Clean up (should never get here!)---*/ close(sockfd); return 0; }