File: localserversocket.yo

package info (click to toggle)
bobcat 3.01.00-1
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 6,612 kB
  • sloc: cpp: 12,107; makefile: 8,055; perl: 401; sh: 329
file content (192 lines) | stat: -rw-r--r-- 7,761 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
includefile(include/header)

COMMENT(manpage, section, releasedate, archive, short name)
manpage(FBB::LocalServerSocket)(3bobcat)
        (_CurYrs_)(libbobcat1-dev__CurVers_-x.tar.gz)
        (Unix Domain Server Socket)

manpagename(FBB::LocalServerSocket)
            (Unix Domain Server socket accepting connection requests)

manpagesynopsis()
    bf(#include <bobcat/localserversocket>)nl()
    Linking option: tt(-lbobcat) 

manpagedescription()
    An bf(FBB::LocalServerSocket) defines a Unix Domain server socket,
listening for connection requests from the local host using a Unix Domain
socket. Connection requests may be accepted in either em(blocking) or
em(non-blocking) modes. When a connection is accepted a socket is returned
which may be used to read information from or write information to the client
requesting the connection. The socket that is made available is a em(file
descriptor) which may be used to initialize a bf(std::istream) and/or
bf(std::ostream). The bf(std::istream) is used to read information from the
client process; the bf(std::ostream) is used to send information to the client
process.  Since a socket may be considered a em(file descriptor) the avaiable
bf(FBB::IFdStream), bf(FBB::IFdStreamBuf), bf(FBB::OFdStream), and
bf(FBB::OFdStreamBuf) classes may be used profitably here. Note that having
available a socket does not mean that this defines the communication
protocol. It is (still) the responsibility of the programmer to comply with an
existing protocol or to implement a tailor-made protocol. The latter situation
implies that the sequence of input- and output operations is defined by the
programmer.

includefile(include/namespace)

manpagesection(INHERITS FROM)
    bf(FBB::LocalSocketBase)

manpagesection(ENUMERATION)
    The following enumeration is defined in th class
bf(FBB::LocalServerSocket):

    bf(enum Socket)nl()
    This enumeration holds two values:
    itemization(
    itb(KEEP)
        When this value is specified at construction time, the file
representing the Unix Domain Socket will not be removed when the
bf(LocalServerSocket) is destroyed. This is the default value used with the
bf(LocalServerSocket) constructor.
    itb(UNLINK)
        When this value is specified at construction time, the file
representing the Unix Domain Socket will be removed when the
bf(LocalServerSocket) is destroyed.
    )

manpagesection(CONSTRUCTOR)
    itemization(
    itb(LocalServerSocket()) 
        This constructor creates an empty (non-functioning)
tt(FBB::LocalServerSocket) object. Before it can be used, the tt(open()) member
must be called (see below).
    itb(LocalServerSocket(string const &name, Socket action = KEEP) 
        throw (Errno))
        This constructor initializes an bf(FBB::LocalServerSocket) object,
which will listen for connection requests using the named Unix Domain
socket.  An bf(FBB::Errno) is thrown if the socket could not be
constructed. If the constructor is given a second argument
tt(FBB::LocalServerSocket::UNLINK), the constructed socket will be unlinked
when the bf(FBB::LocalServerSocket) object is destroyed.  The construction of
the socket does not mean that the bf(FBB::LocalServerSocket) object is
actually listening for connections. To start listening, the member
bf(listen()) should be called.
    )
    The copy constructor is not available.

manpagesection(MEMBER FUNCTIONS)
    itemization(
    itb(size_t accept())
        The bf(accept()) member returns an tt(size_t) which is a file
descriptor (socket) that may be used to communicate with the client requesting
the connection. In more complex programs the returned file descriptor (socket)
could be passed to a class derived from bf(FBB::Fork), handling the
communication with the child as a separate (child) process.

    itb(void listen(size_t backlog = 5, bool blocking = true))
        The bf(listen()) member defines the way the bf(FBB::LocalServerSocket)
will listen for clients requesting a connection.  It can be used only once
with a bf(FBB::LocalServerSocket). An bf(FBB::Errno) object is thrown if
listening fails.

     The bf(listen()) member's tt(backlog) parameter defines the size of the
bf(FBB::LocalServerSocket)'s internal queue in which connection requests may be
stored waiting for their turn to be serviced. When tt(backlog) requests are
waiting and another request arrives, then that request is lost. 

    The member's second parameter, tt(blocking), is used to control the
blocking mode. By default, blocking is used, and tt(listen()) will wait until
a connection is established. This is ok in situations where clients connect
infrquently and for relatively short time intervals. Otherwise, in more
complex programs, an bf(FBB::Selector) object can be used to sense input on
the server socket and/or on various client sockets.

    itb(void open(string const &name, Socket action = KEEP))
        This member prepares a bf(FBB::LocalServerSocket) object for use. It
should only be used in combination with the default constructor. Following
tt(open()) the tt(FBB:::LocalServerSocket) object will be able to listen for
connection requests using the named Unix Domain socket.  An bf(FBB::Errno) is
thrown if the socket could not be constructed. If the a second argument
tt(FBB::LocalServerSocket::UNLINK), is provided the constructed socket will be
unlinked when the bf(FBB::LocalServerSocket) object is destroyed.  The
construction of the socket does not mean that the bf(FBB::LocalServerSocket)
object is actually listening for connections. To start listening, the member
bf(listen()) should be called next.
    )


manpagesection(EXAMPLE)
    See also the bf(localclientsocket)(3bobcat) example.
        verb(
    #include <iostream>
    #include <bobcat/localserversocket>
    #include <bobcat/ifdstream>
    #include <bobcat/ofdstream>
    
    using namespace std;
    using namespace FBB;
    
    int main(int argc, char **argv)
    try
    {
        if (argc == 1)
        {
            cerr << "Provide local filename, e.g., /tmp/uds\n";
            return 1;
        }
    
        LocalServerSocket server(argv[1]);
    
        cerr << "server using `" << argv[1] << "'" << endl;
    
        cout << 
            "The server terminates when it receives a single `q' on a line\n"
            "A connection is terminated when no input is received anymore.\n"
            "Then another connection is possible" << endl;
    
        server.listen();                // listen in blocking mode
    
        while (true)
        {
            int fd = server.accept();
    
            cerr << "Client FD = " << fd << ", " << endl;
    
            IFdStream in(fd);           // stream to read from client
            OFdStream out(fd);          // stream to write to client
            string cmd;
            
            while (getline(in, cmd))
            {
                cout << "Got: " << cmd << endl;
                out << "Got: " << cmd << "\r" << endl;
    
                if (cmd[0] == 'q')
                    return 0;
            }
            cout << "Ready for another connection\n";
        }
    }
    catch (Errno const &err)
    {
        cerr <<
            err.what() << endl <<
            "Server socket on port " << argv[1] << 
            " can't be opened" << endl;
        return -1;
    }        
        )

manpagefiles()
    em(bobcat/serversocket) - defines the class interface

manpageseealso()
    bf(bobcat)(7), bf(localclientsocket)(3bobcat), bf(fork)(3bobcat),
bf(ifdstream)(3bobcat), bf(ifdstreambuf)(3bobcat),
bf(localsocketbase)(3bobcat), bf(ofdstream)(3bobcat), bf(ofdstream)(3bobcat),
bf(select)(2), bf(selector)(3bobcat), bf(serversocket)(3bobcat)

manpagebugs()
    None Reported.

includefile(include/trailer)