📄 testserver.c
字号:
/* testServer - prints a client's messages and sends user-specified replies *//* Copyright 1984-1993 Wind River Systems, Inc. *//*modification history--------------------01b,06dec94,bss cleaned up.01a,???????,??? written.*//*DESCRIPTIONtestServer sets up a TCP socket and then processes a client's requests sequentially. When a client requests service, testServer will printthe message sent by the client, prompt the user for a reply to send, and then send the reply. testServer will continue servicing the client until it is done. Then testServer will exit. Typically,a server would sit in an infinite loop processing requests from multiple clients.*/#include <stdio.h>#include <arpa/inet.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <unistd.h>/* defines */#define MAX_MSG_SIZE 80#define FOREVER for (;;) /* for WRS coding conventions */#define LOCAL static/* typedefs */typedef int SOCK_FD;/* forward declarations */LOCAL void doRequest ();LOCAL void error ();/******************************************************************************* * * main - entry point of testServer * * This routine sets up a TCP socket and then sits in an infinite * loop accepting clients' requests. When a request is made, * doRequest () is called to process the request. */main (argc, argv) int argc; char **argv; { u_short port; int clientAddrLength; SOCK_FD sockFd; SOCK_FD newSockFd; struct sockaddr_in clientAddr; struct sockaddr_in srvAddr; clientAddrLength = sizeof (clientAddr); /* Get the server port number */ if (argc != 2) { fprintf (stderr, "Usage: %s portNumber\n", argv[0]); exit (1); } port = (u_short) atoi(argv[1]); /* Create a socket */ if ( (sockFd = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0 ) error ("Socket failed"); /* * Bind to a well known address. INADDR_ANY says any network * interface will do. hton?() routines put things in network * byte order */ bzero ((char *)&srvAddr, sizeof (srvAddr)); srvAddr.sin_family = AF_INET; srvAddr.sin_port = htons (port); srvAddr.sin_addr.s_addr = INADDR_ANY; if (bind (sockFd, &srvAddr, sizeof(srvAddr)) < 0) { close (sockFd); error ("Bind failed"); } /* Queue only one request */ if (listen (sockFd, 1) < 0) { close (sockFd); error ("Listen failed"); } /* * Service request. Typically, the server would be in an infinite loop, * granting requests to many clients. In this example, we service just * a single client and then exit. */ FOREVER { newSockFd = accept (sockFd, &clientAddr, &clientAddrLength); if (newSockFd < 0) { close (sockFd); error ("Accept failed"); } doRequest (newSockFd, &clientAddr); printf ("\nServer socket closing\n"); /* These three lines would not */ close (sockFd); /* be here in a more typical */ exit (0); /* application. */ } }/************************************************************************ * * doRequest - read the clients requests from the socket and honor them. * * In a more typical application, this routine would fork of anouther * process to handle the request. * */LOCAL void doRequest (sock, pClientAddr) SOCK_FD sock; struct sockaddr_in * pClientAddr; { char buf [MAX_MSG_SIZE]; int msgSize; char * pClientInet; u_short clientPort; pClientInet = inet_ntoa(pClientAddr->sin_addr); clientPort = ntohs(pClientAddr->sin_port); printf ("Client connected from inet %s, port %d\n\n", pClientInet, clientPort ); FOREVER { msgSize = read (sock, buf, MAX_MSG_SIZE - 1); /* Read error ? */ if (msgSize < 0) { close (sock); error ("Read failed"); } /* Connection closed ? */ else if (msgSize == 0) { close (sock); break; } /* Print client message and send reply */ else { printf ("Here is your %d byte message: \n%s\n\n", msgSize, buf); printf ("Enter message to send back: "); fflush (stdout); msgSize = read (STDIN_FILENO, buf, MAX_MSG_SIZE); buf [msgSize] = '\0'; /* must null terminate string */ if (write (sock, buf, msgSize+1) < 0) { close (sock); error ("Write failed."); } } } }/************************************************************************ * * error - print an error message and exit. * */LOCAL void error (pStr) char * pStr; { perror (pStr); exit (1); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -