// Passive. C for TCP and UDP # include
# Include
# Include
# Include
# Include
# Include
Void error (INT status, int err, char * FMT ,...) {va_list AP; va_start (AP, FMT); vfprintf (stderr, FMT, AP); va_end (AP); If (ERR) fprintf (stderr ,": % s (% d)/n ", strerror (ERR), err); If (Status) Exit (Status);} static void set_address (const char * hname, const char * sname, struct sockaddr_in * sap, char * protocol) {struct servent * sp; struct hostent * HP; short port; bzero (SAP, sizeof (* SAP )); SAP-> sin_family = Af_inet; If (hname! = NULL) {If (! Inet_aton (hname, & sap-> sin_addr) {HP = gethostbyname (hname); If (HP = NULL) error (1, 0, "unkown host % s ", hname); SAP-> sin_addr = * (struct in_addr *) HP-> h_addr;} else sap-> sin_addr.s_addr = htonl (inaddr_any); If (sp = getservbyname (sname, protocol) sap-> sin_port = Sp-> s_port; else if (SAP-> sin_port = htons (short) atoi (sname) = 0) error (1, 0, "unkown Serivce % s", sname);} INT server (char * HN Ame, char * sname, char * protocol) {struct sockaddr_in local; int S, type; const int on = 1; if (strcmp (protocol, "TCP") = 0) type = sock_stream; else type = sock_dgram; If (S = socket (af_inet, type, 0) <= 0) error (1, 0, "Create socket failed! "); Set_address (hname, sname, & Local, Protocol); If (setsockopt (S, sol_socket, so_reuseaddr, & on, sizeof (on) error (1, errno, "setsocket option failed! "); If (BIND (S, (struct sockaddr *) & Local, sizeof (local) error (1, errno," bind failed! "); If (type = sock_stream) & listen (S, 5) error (1, errno," Listen error! "); Return s;} // tcpserver. c sub-process # include
# Include
# Include
# Include
# Include
# Include
# Include
# Include
# Include
Void process_server (int s, struct sockaddr_in * remote) {int Len; time_t Ti; char buff [128]; printf ("connection from: % s: % d/N ", inet_ntoa (Remote-> sin_addr), ntohs (Remote-> sin_port); Ti = Time (null); // snprintf (buff, sizeof (buff ), "% S/R/N", ctime (& Ti); While (LEN = Recv (S, buff, sizeof (buff), 0)> 0) {buff [Len] = '/0'; send (S, buff, strlen (buff), 0); bzero (buff, sizeof (buff ));}} void sig_child () {pid_t PID; int Status; while (pid = waitpid (-1, & status, wnohang)> 0) printf ("% d terminated! /N ", pid); // while (wait (& Status)> 0);} int main (INT argc, char ** argv) {struct sockaddr_in remote; char * hname, * sname; int S, C, Len; pid_t PID; If (argc <2) error (1, 0, "parameters less than 2 "); else if (argc = 2) {hname = NULL; sname = argv [1];} else if (argc = 3) {hname = argv [1]; sname = argv [2];} s = server (hname, sname, "TCP"); signal (sigchld, sig_child); Len = sizeof (struct sockaddr); While (1) {If (C = accept (S, (struct sockaddr *) & remote, & Len) <= 0) {If (errno = eintr) continue; error (1, errno, "Accept error! ") ;}If (pid = fork ()> 0) {close (c); continue;} else if (PID <0) Err (1,0," fork error! "); Close (s); process_server (C, & remote); exit (0);} Close (s); exit (0);} // tcpserver. c. Use select # include
# Include
# Include
# Include
# Include
# Include
# Include
# Include
# Include
# Include
Void sig_child () {pid_t PID; int status; while (pid = waitpid (-1, & status, wnohang)> 0) printf ("% d terminated! /N ", pid); // while (wait (& Status)> 0);} int main (INT argc, char ** argv) {struct sockaddr_in remote; char * hname, * sname; int S, C, Len, FD; pid_t PID; fd_set rset, allset; int client [1024]; int I, Maxi, maxfd, nready; char buff [1024]; If (argc <2) error (, "parameters less than 2"); else if (argc = 2) {hname = NULL; sname = argv [1];} else if (argc = 3) {hname = argv [1]; sname = argv [2];} s = server (HN Ame, sname, "TCP"); signal (sigchld, sig_child); Len = sizeof (struct sockaddr); fd_zero (& allset); fd_zero (& rset); fd_set (S, & allset); Maxi = 0; maxfd = s; for (I = 0; I <1024; I ++) Client [I] =-1; while (1) {rset = allset; If (nready = select (maxfd + 1, & rset, null) <0) error (1, 0, "select Error !! "); If (fd_isset (S, & rset) {If (C = accept (S, (struct sockaddr *) & remote, & Len) <= 0) {error (1, errno, "Accept error! ") ;}For (I = 0; I <1024; I ++) {If (Client [I]! =-1) continue; else {client [I] = C; break ;}} if (I = 1024) error (, "too has clients !! "); Fd_set (C, & allset); If (C> maxfd) maxfd = C; if (I> Maxi) maxi = I; If (-- nready = 0) continue;} for (I = 0; I <= Maxi; I ++) {If (FD = client [I]) =-1) continue; if (fd_isset (FD, & rset) {If (LEN = Recv (FD, buff, sizeof (buff), 0)> 0) {buff [Len] = '/0'; send (FD, buff, strlen (buff), 0); bzero (buff, sizeof (buff ));} else {close (FD); fd_clr (FD, & allset); client [I] =-1 ;}if (-- nready = 0) Break ;}}} close (s); exit (0);} // udpserver .. C # include
# Include
# Include
# Include
# Include
# Include
Void process_server (INT s) {struct sockaddr_in remote; char buff [128]; int Len, N; while (1) {n = recvfrom (S, buff, sizeof (buff ), 0, (struct sockaddr *) & remote, & Len); // printf ("% s, % d/N", buff, N ); buff [N] = '/0'; sendto (S, buff, strlen (buff), 0, (struct sockaddr *) & remote, sizeof (remote ));}} int main (INT argc, char ** argv) {struct sockaddr_in remote; char * hname, * sname; int S, C, Len; If (argc <2) error (1, 0, "parameters less than 2"); else if (argc = 2) {hname = NULL; sname = argv [1];} else if (argc = 3) {hname = argv [1]; sname = argv [2];} s = server (hname, sname, "UDP"); process_server (s); close (s ); exit (0 );}