00001
00002
00003
00004
00005
00006
00007
00008 #ifndef WOSCTCPSERVER_H_
00009 #define WOSCTCPSERVER_H_
00010
00011 #include "WOscTcpHandler.h"
00012
00013 #if OS_IS_LINUX == 1 || OS_IS_MACOSX == 1 || OS_IS_CYGWIN == 1
00014
00015 #include <vector>
00016
00017 #ifdef DEBUG
00018 # include <iostream>
00019 # define WOSC_ERR_PRT(MSG) std::cerr<<__FILE__<<" L"<<__LINE__<<" "<<__FUNCTION__<<": "<<MSG<<std::endl;
00020 # define WOSC_DBG_PRT(MSG) std::cout<<__FILE__<<" L"<<__LINE__<<" "<<__FUNCTION__<<": "<<MSG<<std::endl;
00021 #else
00022 # define WOSC_ERR_PRT(MSG)
00023 # define WOSC_DBG_PRT(MSG)
00024 #endif
00025
00026
00027 class WOscTcpServer;
00028
00029
00030
00031
00032
00033
00034 class WOscTcpServerHandler: public WOscTcpHandler
00035 {
00036 public:
00037 WOscTcpServerHandler(WOscTcpServer* server): m_server(server) { }
00038 protected:
00039 virtual void ReceiveThread();
00040 WOscTcpServer* GetServer() { return m_server; }
00041 virtual void HandleOffendingPackets(const char* const data, int dataLen,
00042 const WOscException& exception) { }
00043 virtual void HandleNonmatchedMessages(const WOscMessage* msg,
00044 const WOscNetReturn* networkReturnAddress) { }
00045 private:
00046 WOscTcpServer* m_server;
00047 };
00048
00049 class WOscTcpServer {
00050 public:
00051 WOscTcpServer(bool threading = true);
00052 virtual ~WOscTcpServer();
00053
00054 typedef enum {
00055 WOS_TCPS_ERR_NO_ERR = 0,
00056 WOS_TCPS_ERR_OPEN_SOCKET,
00057 WOS_TCPS_ERR_BIND,
00058 WOS_TCPS_ERR_CREATE_THREAD,
00059 WOS_TCPS_ERR_NO_SERVER_SOCKET,
00060 WOS_TCPS_ERR_ACCEPT,
00061 WOS_TCPS_ERR_SET_NONBLOCKING,
00062 WOS_TCPS_ERR_ALREADY_BOUND,
00063 WOS_TCPS_ERR_SERVER_RUNNING,
00064 WOS_TCPS_ERR_LISTEN,
00065 } Error;
00066 static const char* GetErrStr(Error err);
00067 Error Bind(int port, in_addr_t addr = INADDR_ANY);
00068 Error Start();
00069 Error Stop();
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086 virtual WOscTcpServerHandler::Error SetupHandlerForNewConnection(WOscTcpServerHandler** handler, int socket, const TheNetReturnAddress& peer) = 0;
00087 int GetServerSocket() const { return m_socketServer; }
00088 protected:
00089 friend void* wosc_tcp_server_thread(void* argument);
00090 Error Accept();
00091 friend class WOscTcpServerHandler;
00092 void Register(WOscTcpServerHandler* handler)
00093 {
00094 pthread_mutex_lock(&m_connectionsMutex);
00095 m_connections.push_back(handler);
00096 pthread_mutex_unlock(&m_connectionsMutex);
00097 }
00098 bool UnRegister(WOscTcpServerHandler* handler)
00099 {
00100 bool ret = false;
00101 pthread_mutex_lock(&m_connectionsMutex);
00102 for ( int i = m_connections.size(); i >= 0; i-- )
00103 if ( m_connections[i] == handler ){
00104 m_connections.erase(m_connections.begin()+i);
00105 ret = true;
00106 break;
00107 }
00108 pthread_mutex_unlock(&m_connectionsMutex);
00109 return ret;
00110 }
00111
00112 private:
00113 int m_socketServer;
00114 bool m_threading;
00115 pthread_t m_serverThreadID;
00116 std::vector<WOscTcpServerHandler*> m_connections;
00117 pthread_mutex_t m_connectionsMutex;
00118 };
00119
00120 #else
00121 # warning "WOscTcpServer not supported on this platform"
00122 #endif
00123
00124 #endif