ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/cms/source/host/c++/socket++-1.10/echo.C
Revision: 1.1
Committed: Mon Feb 26 15:01:39 2001 UTC (23 years, 8 months ago) by ab11
Content type: text/plain
Branch: MAIN
CVS Tags: PROJECT_COMPLETION
Log Message:
Networking class. Assumed to be bug free.

File Contents

# Content
1 // echo.C -*- C++ -*- socket library
2 // Copyright (C) 1992,1993,1994 Gnanasekaran Swaminathan <gs4t@virginia.edu>
3 //
4 // Permission is granted to use at your own risk and distribute this software
5 // in source and binary forms provided the above copyright
6 // notice and this paragraph are preserved on all copies.
7 // This software is provided "as is" with no express or implied warranty.
8 //
9 // Version: 17Oct95 1.10
10
11 #include <config.h>
12
13 #include <echo.h>
14 #include <Fork.h>
15 #include <stdlib.h>
16
17 void echo::echobuf::serve_clients (int portno)
18 {
19 if (protocol_name ()) {
20 if (portno < 0)
21 sockinetbuf::bind ((unsigned long) INADDR_ANY, "echo", protocol_name ());
22 else if (portno <= 1024) {
23 sockinetbuf::bind ();
24 cout << "Host: " << localhost () << endl
25 << "Port: " << localport () << endl;
26 } else
27 sockinetbuf::bind ((unsigned long) INADDR_ANY, portno);
28
29 // act as a server now
30 listen (sockbuf::somaxconn);
31
32 // commit suicide when we receive SIGTERM
33 Fork::suicide_signal (SIGTERM);
34
35 for (;;) {
36 sockbuf s = accept ();
37
38 Fork f (1, 1); // kill my children when I get terminated.
39
40 if (f.is_child ()) {
41 char buf [1024];
42 int rcnt;
43
44 while ((rcnt = s.read (buf, 1024)) > 0)
45 while (rcnt != 0) {
46 int wcnt = s.write (buf, rcnt);
47 if (wcnt == -1) {
48 error ("echo::echobuf::bind");
49 return;
50 }
51 rcnt -= wcnt;
52 }
53 sleep (300);
54 exit (0);
55 }
56 }
57 }
58 }
59