Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #pragma once
00015
00019 #ifdef LINUX
00020 #include <sys/types.h>
00021 #include <sys/socket.h>
00022 #include <netinet/in.h>
00023 #include <netdb.h>
00024 #endif
00025
00026 #include "Socket.h"
00027 #include "NetworkServer.h"
00028 #include "MessageConnection.h"
00029
00030 namespace kNet
00031 {
00032
00033 class NetworkWorkerThread;
00034
00036 class Network
00037 {
00038 public:
00039 Network();
00040 ~Network();
00041
00042 static void PrintAddrInfo(const addrinfo *address);
00043
00044 void PrintHostNameInfo(const char *hostname, const char *port);
00045
00052 NetworkServer *StartServer(unsigned short port, SocketTransportLayer transport, INetworkServerListener *serverListener, bool allowAddressReuse);
00053
00060 NetworkServer *StartServer(const std::vector<std::pair<unsigned short, SocketTransportLayer> > &listenPorts, INetworkServerListener *serverListener, bool allowAddressReuse);
00061
00062 void StopServer();
00063
00065 Socket *ConnectSocket(const char *address, unsigned short port, SocketTransportLayer transport);
00066
00069 void CloseSocket(Socket *socket);
00070
00071 void CloseConnection(Ptr(MessageConnection) connection);
00072
00075 Ptr(MessageConnection) Connect(const char *address, unsigned short port, SocketTransportLayer transport, IMessageHandler *messageHandler, Datagram *connectMessage = 0);
00076
00078 const char *LocalAddress() const { return localHostName.c_str(); }
00079
00081 static std::string GetErrorString(int error);
00082
00084 static std::string GetLastErrorString();
00085
00087 static int GetLastError();
00088
00090 void AssignConnectionToWorkerThread(Ptr(MessageConnection) connection);
00091
00093 int NumWorkerThreads() const { return workerThreads.size(); }
00094
00095 Ptr(NetworkServer) GetServer() { return server; }
00096
00097 private:
00100 std::string localHostName;
00101
00104 Ptr(NetworkServer) server;
00105
00107 std::list<Socket> sockets;
00108
00110 Socket *StoreSocket(const Socket &cp);
00111
00112 friend class NetworkServer;
00113
00114 void SendUDPConnectDatagram(Socket &socket, Datagram *connectMessage);
00115
00119 Socket *CreateUDPSlaveSocket(Socket *serverListenSocket, const EndPoint &remoteEndPoint, const char *remoteHostName);
00120
00125 Socket *OpenListenSocket(unsigned short port, SocketTransportLayer transport, bool allowAddressReuse);
00126
00130 std::vector<NetworkWorkerThread*> workerThreads;
00131
00135 NetworkWorkerThread *GetOrCreateWorkerThread();
00136
00137 void Init();
00138 void DeInit();
00139
00140 #ifdef WIN32
00141 WSADATA wsaData;
00142 #endif
00143 };
00144
00146 std::string FormatBytes(size_t numBytes);
00147
00148 }