00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 #include <cc++/socket.h>
00043 #include <cstdlib>
00044
00045 #ifdef CCXX_NAMESPACES
00046 using namespace std;
00047 using namespace ost;
00048 #endif
00049
00050 class myTCPSocket : public TCPSocket
00051 {
00052 protected:
00053 bool onAccept(const InetHostAddress &ia, tpport_t port);
00054
00055 public:
00056 myTCPSocket(InetAddress &ia);
00057 };
00058
00059 class myTCPSession : public TCPSession
00060 {
00061 private:
00062 static Mutex mutex;
00063 void run(void);
00064 void final(void);
00065
00066 public:
00067 myTCPSession(TCPSocket &server);
00068 static volatile int count;
00069 };
00070
00071 myTCPSocket::myTCPSocket(InetAddress &ia) : TCPSocket(ia, 4096) {}
00072
00073 bool myTCPSocket::onAccept(const InetHostAddress &ia, tpport_t port)
00074 {
00075 cout << "accepting from: " << ia.getHostname() << ":" << port << endl;;
00076 return true;
00077 }
00078
00079 volatile int myTCPSession::count = 0;
00080
00081 Mutex myTCPSession::mutex;
00082
00083 myTCPSession::myTCPSession(TCPSocket &server) :
00084 TCPSession(server)
00085 {
00086 cout << "creating session client object" << endl;
00087 mutex.enterMutex();
00088 ++count;
00089 mutex.leaveMutex();
00090
00091 }
00092
00093 void myTCPSession::run(void)
00094 {
00095 tpport_t port;
00096 IPV4Address addr = getLocal(&port);
00097 *tcp() << "welcome to " << addr.getHostname() << " from socket " << (int)so << endl;
00098 mutex.enterMutex();
00099 *tcp() << "called from thread " << count << endl;
00100 mutex.leaveMutex();
00101 sleep(5000);
00102 *tcp() << "ending session" << endl;
00103 }
00104
00105 void myTCPSession::final(void)
00106 {
00107 }
00108
00109 int main()
00110 {
00111 myTCPSession *tcp;
00112 BroadcastAddress addr;
00113 addr = "255.255.255.255";
00114 cout << "testing addr: " << addr.getHostname() << ":" << 4096 << endl;
00115 addr = "127.0.0.1";
00116 cout << "binding for: " << addr.getHostname() << ":" << 4096 << endl;
00117
00118 try {
00119 myTCPSocket server(addr);
00120
00121 while(server.isPendingConnection(30000)) {
00122 cout << "before create" << endl;
00123 tcp = new myTCPSession(server);
00124 cout << "after create" << endl;
00125 tcp->detach();
00126 }
00127 }
00128 catch(Socket *socket) {
00129 tpport_t port;
00130 int err = socket->getErrorNumber();
00131 InetAddress saddr = (InetAddress)socket->getPeer(&port);
00132 cerr << "socket error " << saddr.getHostname() << ":" << port << " = " << err << endl;
00133 if(err == Socket::errBindingFailed) {
00134 cerr << "bind failed; port busy" << endl;
00135 ::exit(-1);
00136 }
00137 else
00138 cerr << "client socket failed" << endl;
00139 }
00140 cout << "timeout after 30 seconds inactivity, exiting" << endl;
00141 return 0;
00142 }
00143