diff --git a/.gitignore b/.gitignore index 0727321..b6e0d30 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ .d/ .o/ imgui/ +res/ main_client main_server *.png -res/ diff --git a/Makefile b/Makefile index dc2f75e..32a22ef 100644 --- a/Makefile +++ b/Makefile @@ -6,6 +6,7 @@ SRCDIR := src OBJDIR := .o DEPDIR := .d TESTDIR := test +TEST_BINDIR := $(TESTDIR)/bin MKDIR := mkdir -p # }}} @@ -21,13 +22,10 @@ IMGUI_SRCS := \ imgui/imgui_tables.cpp \ imgui/imgui_widgets.cpp -SRCS := $(wildcard $(SRCDIR)/*.cpp) $(IMGUI_SRCS) +SRCS := $(wildcard $(SRCDIR)/*.cpp) $(IMGUI_SRCS) $(wildcard $(TESTDIR)/*.cpp) OBJS := $(patsubst %,$(OBJDIR)/%.o,$(basename $(SRCS))) DEPS := $(patsubst %,$(DEPDIR)/%.d,$(basename $(SRCS))) -$(shell $(MKDIR) $(dir $(OBJS)) >/dev/null) -$(shell $(MKDIR) $(dir $(DEPS)) >/dev/null) - COMMON_OBJS := \ $(OBJDIR)/src/lib_lua_common.o \ $(OBJDIR)/src/lib_SDL_common.o \ @@ -60,7 +58,11 @@ TEST_OBJ_COMMON := \ TESTS := test_FileIO test_lua test_UDPpacketBufferV -TEST_PROGS := $(addprefix $(TESTDIR)/,$(TESTS)) +TEST_PROGS := $(addprefix $(TEST_BINDIR)/,$(TESTS)) + +$(shell $(MKDIR) $(dir $(OBJS)) >/dev/null) +$(shell $(MKDIR) $(dir $(DEPS)) >/dev/null) +$(shell $(MKDIR) $(dir $(TEST_PROGS)) >/dev/null) # {{{ Flags CC := gcc @@ -147,12 +149,16 @@ main_server: $(SERVER_OBJS) $(LINK.o) $^ $(LDLIBS) test: $(TEST_PROGS) + @echo $(TEST_PROGS) -test/test_FileIO: $(TEST_OBJ_COMMON) $(OBJDIR)/src/util.o +$(TEST_BINDIR)/test_FileIO: $(OBJDIR)/test/test_FileIO.o $(TEST_OBJ_COMMON) $(OBJDIR)/src/util.o + $(LINK.o) $^ $(LDLIBS) -test/test_lua: $(TEST_OBJ_COMMON) $(OBJDIR)/src/lib_lua_common.o +$(TEST_BINDIR)/test_lua: $(OBJDIR)/test/test_lua.o $(TEST_OBJ_COMMON) $(OBJDIR)/src/lib_lua_common.o + $(LINK.o) $^ $(LDLIBS) -test/test_UDPpacketBufferV: $(TEST_OBJ_COMMON) $(OBJDIR)/src/UDPbase.o $(OBJDIR)/src/lib_SDL_common.o +$(TEST_BINDIR)/test_UDPpacketBufferV: $(OBJDIR)/test/test_UDPpacketBufferV.o $(TEST_OBJ_COMMON) $(OBJDIR)/src/UDPbase.o $(OBJDIR)/src/lib_SDL_common.o + $(LINK.o) $^ $(LDLIBS) $(OBJDIR)/%.o: %.c $(OBJDIR)/%.o: %.c $(DEPDIR)/%.d diff --git a/include/Server.h b/include/Server.h index 447ee58..57356c8 100644 --- a/include/Server.h +++ b/include/Server.h @@ -6,7 +6,7 @@ #include "lib_lua_common.h" #include "UDPbase.h" -#define DEFAULT_MAX_SOCKET_TIMEOUT 10 +#define DEFAULT_SOCKET_TIMEOUT 10 class Server : public UDPbase { @@ -15,18 +15,24 @@ class Server : public UDPbase std::vector TCPsocks; std::vector UDPsocks; - UDPpacket** UDPPacketV; SDLNet_SocketSet SocketSet; + UDPpacket** packetV; lua_State *mLuaState; public: Server (const char* host, const Uint16 port); ~Server (void); + /* + * error: invalid use of non-static member function Uint32 Server::FetchPacketsCallback(Uint32, void*) + * Don't understand this. + * static keyword fixes it. + */ static Uint32 FetchPacketsCallback (Uint32 interval, void* param); + void ProcessPacketHelper (UDPpacket* packet); void RunLua (const std::string& buf); - int AllocateApproximateBufferSpace (const int nclients); + int AllocateApproximateResources (const int nclients); int Start (void); int Stop (void); void CloseAllSockets (void); @@ -38,9 +44,9 @@ class Server : public UDPbase { return SDL_UnlockMutex (mProcessPacketMutex); } - lua_State* getLuaState(void) const { return mLuaState; } - const TCPsocket* getTCPsock (size_t idx) const { return &TCPsocks.at (idx); } - const UDPsocket* getUDPsock (size_t idx) const { return &UDPsocks.at (idx); } - UDPpacket* getUDPPacketV (size_t idx) const { return UDPPacketV[idx]; } - SDLNet_SocketSet getSocketSet (void) const { return SocketSet; } + lua_State* getLuaState(void) { return mLuaState; } + TCPsocket getTCPsock (size_t idx) { return TCPsocks.at (idx); } + UDPsocket getUDPsock (size_t idx) { return UDPsocks.at (idx); } + UDPpacket** getPacketV (void) { return packetV; } + SDLNet_SocketSet getSocketSet (void) { return SocketSet; } }; diff --git a/src/Server.cpp b/src/Server.cpp index 8a4e558..1ac5f4b 100644 --- a/src/Server.cpp +++ b/src/Server.cpp @@ -3,6 +3,8 @@ #include "util.h" #include "Server.h" +#define DEFAULT_MAX_PACKET_RECV_SIZE 1024 + Server::Server (const char *host, const Uint16 port) : UDPbase (host, port) { @@ -13,8 +15,8 @@ Server::Server (const char *host, const Uint16 port) UDPsocks.push_back (sock); } SocketSet = NULL; - UDPPacketV = NULL; mLuaState = NULL; + packetV = NULL; mProcessPacketMutex = SDL_CreateMutex (); } @@ -22,6 +24,13 @@ Server::Server (const char *host, const Uint16 port) Server::~Server (void) { CloseAllSockets (); + + if (packetV) + { + SDLNet_FreePacketV (packetV); + packetV = NULL; + } + if (mProcessPacketMutex) { SDL_DestroyMutex (mProcessPacketMutex); @@ -45,32 +54,8 @@ Server::CloseAllSockets (void) } -void -Server::ProcessPacketHelper (UDPpacket* packet) -{ - int len; - SDL_Event event; - SDL_UserEvent userevent; - UDPpacket *temp; - len = packet->len; - temp = SDLNet_AllocPacket (len); - temp->address = packet->address; - SDL_memcpy (temp->data, packet->data, len); - temp->len = len; - SDL_zero (event); - SDL_zero (userevent); - userevent.type = PACKET_SDL_EVENT; - userevent.code = 0; - userevent.data1 = (void *) temp; - userevent.data2 = (void *) NULL; - event.type = SDL_USEREVENT; - event.user = userevent; - SDL_PushEvent (&event); -} - - int -Server::AllocateApproximateBufferSpace (const int nclients) +Server::AllocateApproximateResources (const int nclients) { int i, l, numused, total; @@ -82,11 +67,20 @@ Server::AllocateApproximateBufferSpace (const int nclients) SDL_Log ("Preparing to serve %d clients", nclients); - if (!(UDPPacketV = SDLNet_AllocPacketV (nclients, DEFAULT_MAX_PACKET_SIZE))) + /* + * If each client sends 1024 250 byte packets, that's 1/4th of a MB or 256000 bytes ... + * seems fine for now as an upper limit. + */ + if (packetV) + { + SDLNet_FreePacketV (packetV); + } + if (!(packetV = SDLNet_AllocPacketV (1024 * nclients, DEFAULT_MAX_PACKET_RECV_SIZE))) { SDL_Log ("SDLNet_AllocPacketV: %s", SDLNet_GetError ()); return -1; } + if (!(SocketSet = SDLNet_AllocSocketSet (nclients))) { SDL_Log ("SDLNet_AllocSocketSet: %s", SDLNet_GetError ()); @@ -121,7 +115,7 @@ Server::Start (void) int l; const int nclients = UDPsocks.size (); - if ((l = AllocateApproximateBufferSpace (nclients) < 0)) + if ((l = AllocateApproximateResources (nclients) < 0)) { DEBUG_LOG ("Unable to allocate approximate buffer space"); return l; @@ -136,7 +130,7 @@ Server::Start (void) mLuaState = luaL_newstate (); luaL_openlibs (mLuaState); - mFetchPacketsCallbackTimerID = SDL_AddTimer (10, Server::FetchPacketsCallback, (void *) this); + mFetchPacketsCallbackTimerID = SDL_AddTimer (DEFAULT_SOCKET_TIMEOUT, Server::FetchPacketsCallback, (void *) this); return Unlock (); } @@ -178,12 +172,6 @@ Server::Stop (void) SocketSet = NULL; } - if (UDPPacketV) - { - SDLNet_FreePacketV (UDPPacketV); - UDPPacketV = NULL; - } - return 0; } @@ -195,10 +183,39 @@ Server::RunLua (const std::string& buf) } +void +Server::ProcessPacketHelper (UDPpacket* src) +{ + SDL_Event event; + SDL_UserEvent userevent; + UDPpacket *dst; + + dst = SDLNet_AllocPacket (src->len); + dst->address = src->address; + dst->channel = src->channel; + dst->status = src->status; + dst->len = src->len; + dst->maxlen = src->maxlen; + SDL_memset (dst->data, 0, src->len); + SDL_memcpy (dst->data, src->data, src->len); + + SDL_zero (event); + SDL_zero (userevent); + userevent.type = PACKET_SDL_EVENT; + userevent.code = 0; + userevent.data1 = (void *) dst; + userevent.data2 = (void *) NULL; + event.type = SDL_USEREVENT; + event.user = userevent; + SDL_PushEvent (&event); +} + + Uint32 Server::FetchPacketsCallback (Uint32 interval, void *param) { - int numrecv, numready; int i, j; + int numrecv, numready; + UDPpacket** packetV; SDL_assert (NULL != param); Server* server = (Server *) param; @@ -209,7 +226,7 @@ Uint32 Server::FetchPacketsCallback (Uint32 interval, void *param) return 0; } - numready = SDLNet_CheckSockets (server->getSocketSet (), DEFAULT_MAX_SOCKET_TIMEOUT); + numready = SDLNet_CheckSockets (server->getSocketSet (), 1); if (numready < 0) { DEBUG_LOG ("SDLNet_CheckSockets: %s", SDLNet_GetError ()); @@ -221,20 +238,24 @@ Uint32 Server::FetchPacketsCallback (Uint32 interval, void *param) } /* check all sockets with SDLNet_SocketReady and handle the active ones. */ + UDPsocket udpsocket; + packetV = server->getPacketV (); for (i = 0; i < numready; i++) { - if (SDLNet_SocketReady (*server->getUDPsock (i))) + udpsocket = server->getUDPsock (i); + if (SDLNet_SocketReady (udpsocket)) { - UDPpacket* packet = server->getUDPPacketV (i); - numrecv = SDLNet_UDP_RecvV (*server->getUDPsock (i), &packet); + numrecv = SDLNet_UDP_RecvV (udpsocket, packetV); if (numrecv < 0) { DEBUG_LOG ("SDLNet_UDP_RecvV: %s", SDLNet_GetError ()); break; } + + /* j!!!! NOT i!!!!! */ for (j = 0; j < numrecv; j++) { - server->ProcessPacketHelper (packet); + server->ProcessPacketHelper (packetV[j]); } } } diff --git a/src/UDPpacketVBuffer.cpp b/src/UDPpacketVBuffer.cpp index 803fa5b..25e2ebd 100644 --- a/src/UDPpacketVBuffer.cpp +++ b/src/UDPpacketVBuffer.cpp @@ -15,6 +15,7 @@ UDPpacketVBuffer::UDPpacketVBuffer (UDPpacket* src, const void* buf, const size_ SDL_assert (mtu > 0); npackets = (int)ceil ((double) size / (double) mtu); + SDL_Log ("%d", npackets); if (NULL == (packetV = SDLNet_AllocPacketV (npackets, mtu))) { throw "SDLNet_AllocPacketV: " + std::string (SDLNet_GetError ()); diff --git a/src/lib_SDL_common.cpp b/src/lib_SDL_common.cpp index 90e8036..a5244c7 100644 --- a/src/lib_SDL_common.cpp +++ b/src/lib_SDL_common.cpp @@ -112,7 +112,7 @@ common_SDL_Init (void) { Uint32 Flags; - common_Signal_Init (); + // common_Signal_Init (); Flags = SDL_INIT_EVERYTHING; if (SDL_Init (Flags) < 0) diff --git a/src/server_main.cpp b/src/server_main.cpp index ec30a4e..cad8a72 100644 --- a/src/server_main.cpp +++ b/src/server_main.cpp @@ -96,9 +96,13 @@ my_SDL_UserEvent (SDL_Event * ev) { case PACKET_SDL_EVENT: { - UDPpacket *packet = (UDPpacket *) ev->user.data1; - my_ProcessPacket (packet); - SDLNet_FreePacket (packet); + UDPpacket* packet = (UDPpacket *) ev->user.data1; + if (packet) + { + SDL_Log ("PACKET_SDL_EVENT"); + my_ProcessPacket (packet); + SDLNet_FreePacket (packet); + } } break; default: @@ -128,6 +132,8 @@ my_ProcessPacket (UDPpacket* packet) SDL_assert (packet->len > 0); len = packet->len; + if (len > sizeof (SDL_Event)) + len = sizeof (SDL_Event); SDL_memcpy (&event, packet->data, len); // SDL_Log ("%d, %x", packet->len, event.type); diff --git a/src/util.cpp b/src/util.cpp index 7449e7d..d753319 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -65,24 +65,23 @@ util_HexDump (const void* buf, const size_t len) void util_UDP_DumpPacket (UDPpacket* packet) { - const char* buf; + const uint8_t* buf; SDL_assert (packet != NULL); // SDL_assert (packet->len > 0); - buf = (const char*)packet->data; - - SDL_Log ("address: %s", SDLNet_ResolveIP (&packet->address)); + SDL_Log ("address: %s:%d", SDLNet_ResolveIP (&packet->address), SDLNet_Read16 (&packet->address.port)); SDL_Log ("channel: %d", packet->channel); SDL_Log ("len : %d", packet->len); SDL_Log ("maxlen : %d", packet->maxlen); SDL_Log ("status : %d", packet->status); - if (packet->len) + if (packet->len > 0) { - if (util_IsProbablyAscii (buf, packet->len)) - SDL_Log ("data:\n%s", buf); - else + buf = (const uint8_t*)packet->data; + // if (util_IsProbablyAscii (buf, packet->len)) + // SDL_Log ("data:\n%s\n", buf); + // else util_HexDump (buf, packet->len); } else diff --git a/test/.gitignore b/test/.gitignore index 2a0ff48..e660fd9 100644 --- a/test/.gitignore +++ b/test/.gitignore @@ -1,5 +1 @@ -test_FileIO -test_File_Write_UDP -test_lua -test_Object -test/test_UDP_DumpPacket +bin/ diff --git a/test/test_UDPpacketBufferV.cpp b/test/test_UDPpacketBufferV.cpp index 4669709..e176814 100644 --- a/test/test_UDPpacketBufferV.cpp +++ b/test/test_UDPpacketBufferV.cpp @@ -1,5 +1,3 @@ -#include "camera.h" -#include "cube.h" #include "debug.h" #include "glCheckErrors.h" #include "lib_GL_common.h"