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
|
<pre>
<font color="#0000ff">// Copyright (c) 2001 David Muse</font>
<font color="#0000ff">// See the file COPYING for more information</font>
<font color="#a020f0">#include </font><font color="#ff00ff"><rudiments/listener.h></font>
<font color="#a020f0">#include </font><font color="#ff00ff"><rudiments/inetserversocket.h></font>
<font color="#a020f0">#include </font><font color="#ff00ff"><rudiments/unixserversocket.h></font>
<font color="#a020f0">#include </font><font color="#ff00ff"><rudiments/permissions.h></font>
<font color="#a020f0">#include </font><font color="#ff00ff"><stdio.h></font>
<font color="#a020f0">#ifdef RUDIMENTS_NAMESPACE</font>
<font color="#a52a2a"><b>using</b></font> <font color="#2e8b57"><b>namespace</b></font> rudiments;
<font color="#a020f0">#endif</font>
<font color="#2e8b57"><b>int</b></font> main(<font color="#2e8b57"><b>int</b></font> argc, <font color="#2e8b57"><b>const</b></font> <font color="#2e8b57"><b>char</b></font> **argv) {
<font color="#0000ff">// listen on inet socket port 1800</font>
inetserversocket inetsock;
<font color="#a52a2a"><b>if</b></font> (!inetsock.listen(<font color="#ff00ff">NULL</font>,<font color="#ff00ff">8000</font>,<font color="#ff00ff">15</font>)) {
printf(<font color="#ff00ff">"couldn't listen on inet socket</font><font color="#6a5acd">\n</font><font color="#ff00ff">"</font>);
}
<font color="#0000ff">// listen on unix socket "/tmp/lsnr.socket"</font>
unixserversocket unixsock;
<font color="#a52a2a"><b>if</b></font> (!unixsock.listen(<font color="#ff00ff">"/tmp/lsnr.socket"</font>,<font color="#a020f0">0</font><font color="#ff00ff">000</font>,<font color="#ff00ff">15</font>)) {
printf(<font color="#ff00ff">"couldn't listen on unix socket</font><font color="#6a5acd">\n</font><font color="#ff00ff">"</font>);
}
<font color="#0000ff">// create a listener and add the 2 sockets to it</font>
listener pool;
pool.addFileDescriptor(&inetsock);
pool.addFileDescriptor(&unixsock);
<font color="#0000ff">// loop...</font>
<font color="#a52a2a"><b>for</b></font> (;;) {
<font color="#0000ff">// wait for a client to connect to one of the sockets</font>
pool.waitForNonBlockingRead(-<font color="#ff00ff">1</font>,-<font color="#ff00ff">1</font>);
filedescriptor *fd=<font color="#ff00ff">NULL</font>;
pool.getReadyList()->getDataByIndex(<font color="#ff00ff">0</font>,&fd);
<font color="#0000ff">// figure out which socket the client connected to</font>
filedescriptor *clientsock;
<font color="#a52a2a"><b>if</b></font> (fd==&inetsock) {
clientsock=inetsock.accept();
printf(<font color="#ff00ff">"inetsock: "</font>);
} <font color="#a52a2a"><b>else</b></font> <font color="#a52a2a"><b>if</b></font> (fd==&unixsock) {
clientsock=unixsock.accept();
printf(<font color="#ff00ff">"unixsock: "</font>);
} <font color="#a52a2a"><b>else</b></font> {
printf(<font color="#ff00ff">"error or timeout waiting...</font><font color="#6a5acd">\n</font><font color="#ff00ff">"</font>);
<font color="#a52a2a"><b>continue</b></font>;
}
<font color="#0000ff">// read 5 bytes from the client and display it</font>
<font color="#2e8b57"><b>char</b></font> buffer[<font color="#ff00ff">6</font>];
buffer[<font color="#ff00ff">5</font>]=(<font color="#2e8b57"><b>char</b></font>)<font color="#ff00ff">NULL</font>;
clientsock->read(buffer,<font color="#ff00ff">5</font>);
printf(<font color="#ff00ff">"</font><font color="#6a5acd">%s</font><font color="#6a5acd">\n</font><font color="#ff00ff">"</font>,buffer);
<font color="#0000ff">// write "hello" back to the client</font>
clientsock->write(<font color="#ff00ff">"hello"</font>,<font color="#ff00ff">5</font>);
<font color="#0000ff">// close the socket and clean up</font>
clientsock->close();
<font color="#a52a2a"><b>delete</b></font> clientsock;
}
}
</pre>
|