From 676a6071fa8e726f8c8ab4e4b100da3fac40e28b Mon Sep 17 00:00:00 2001 From: SoftCoder Date: Wed, 1 Jan 2014 10:59:55 -0800 Subject: [PATCH] - attempt to disable packet throttling on windows - added some network packet debug code --- source/glest_game/main/main.cpp | 10 ++ source/glest_game/network/network_manager.cpp | 4 +- source/glest_game/network/network_message.cpp | 170 ++++++++++++++++-- source/glest_game/network/network_message.h | 40 ++++- .../include/platform/sdl/platform_main.h | 4 + .../sources/platform/posix/socket.cpp | 16 ++ 6 files changed, 229 insertions(+), 15 deletions(-) diff --git a/source/glest_game/main/main.cpp b/source/glest_game/main/main.cpp index ef3851e9..9be50e0d 100644 --- a/source/glest_game/main/main.cpp +++ b/source/glest_game/main/main.cpp @@ -4287,6 +4287,16 @@ int glestMain(int argc, char** argv) { config.setBool("DebugNetworkPackets",true,true); } + if(hasCommandArgument(argc, argv,GAME_ARGS[GAME_ARG_DEBUG_NETWORK_PACKET_SIZES]) == true) { + printf("*NOTE: debugging network packet SIZES.\n"); + config.setBool("DebugNetworkPacketSizes",true,true); + } + + if(hasCommandArgument(argc, argv,GAME_ARGS[GAME_ARG_DEBUG_NETWORK_PACKET_STATS]) == true) { + printf("*NOTE: debugging network packet STATISTICS.\n"); + config.setBool("DebugNetworkPacketStats",true,true); + } + if(hasCommandArgument(argc, argv,GAME_ARGS[GAME_ARG_ENABLE_NEW_PROTOCOL]) == true) { printf("*NOTE: enabling new newtork protocol.\n"); NetworkMessage::useOldProtocol = false; diff --git a/source/glest_game/network/network_manager.cpp b/source/glest_game/network/network_manager.cpp index 6ecc6aed..2d5912a5 100644 --- a/source/glest_game/network/network_manager.cpp +++ b/source/glest_game/network/network_manager.cpp @@ -43,8 +43,8 @@ void NetworkManager::init(NetworkRole networkRole, bool publishEnabled) { if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] this->networkRole = %d, networkRole = %d, gameNetworkInterface [%p]\n",__FILE__,__FUNCTION__,__LINE__,this->networkRole,networkRole,gameNetworkInterface); - assert(gameNetworkInterface==NULL); - + //assert(gameNetworkInterface==NULL); + NetworkMessage::resetNetworkPacketStats(); this->networkRole = networkRole; if(networkRole == nrServer) { diff --git a/source/glest_game/network/network_message.cpp b/source/glest_game/network/network_message.cpp index 7e44ea5e..9cfcbc06 100644 --- a/source/glest_game/network/network_message.cpp +++ b/source/glest_game/network/network_message.cpp @@ -33,6 +33,12 @@ namespace Glest{ namespace Game{ bool NetworkMessage::useOldProtocol = true; +auto_ptr NetworkMessage::mutexMessageStats(new Mutex(CODE_AT_LINE)); +Chrono NetworkMessage::statsTimer; +Chrono NetworkMessage::lastSend; +Chrono NetworkMessage::lastRecv; +std::map NetworkMessage::mapMessageStats; + // ===================================================== // class NetworkMessage // ===================================================== @@ -54,7 +60,7 @@ bool NetworkMessage::receive(Socket* socket, void* data, int dataSize, bool tryR else { if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] dataSize = %d, dataReceived = %d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,dataSize,dataReceived); - dump_packet("\nINCOMING PACKET:\n",data, dataSize); + dump_packet("\nINCOMING PACKET:\n",data, dataSize, false); return true; } } @@ -66,7 +72,7 @@ void NetworkMessage::send(Socket* socket, const void* data, int dataSize) { if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] socket = %p, data = %p, dataSize = %d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,socket,data,dataSize); if(socket != NULL) { - dump_packet("\nOUTGOING PACKET:\n",data, dataSize); + dump_packet("\nOUTGOING PACKET:\n",data, dataSize, true); int sendResult = socket->send(data, dataSize); if(sendResult != dataSize) { if(socket != NULL && socket->getSocketId() > 0) { @@ -81,19 +87,159 @@ void NetworkMessage::send(Socket* socket, const void* data, int dataSize) { } } -void NetworkMessage::dump_packet(string label, const void* data, int dataSize) { - Config &config = Config::getInstance(); - if(config.getBool("DebugNetworkPackets","false") == true) { - printf("%s",label.c_str()); +void NetworkMessage::resetNetworkPacketStats() { + NetworkMessage::statsTimer.stop(); + NetworkMessage::lastSend.stop(); + NetworkMessage::lastRecv.stop(); + NetworkMessage::mapMessageStats.clear(); +} - const char *buf = static_cast(data); - for(unsigned int i = 0; i < (unsigned int)dataSize; ++i) { - printf("%u[%X][%d] ",i,buf[i],buf[i]); - if(i % 10 == 0) { - printf("\n"); +string NetworkMessage::getNetworkPacketStats() { + string result = "Current Timer Milliseconds: " + intToStr(NetworkMessage::statsTimer.getMillis()) + "\n"; + + for(std::map::iterator iterMap = mapMessageStats.begin(); + iterMap != mapMessageStats.end(); ++iterMap) { + switch(iterMap->first) { + case netmsgstPacketsPerMillisecondSend: + result += "send p / msec: " + intToStr(iterMap->second) + (iterMap->second > 10 ? " ****WARNING WIN32 LIMIT EXCEEDED****" : "") + "\n"; + break; + case netmsgstPacketsPerSecondSend: + result += "send p / sec: " + intToStr(iterMap->second) + "\n"; + break; + case netmsgstAverageSendSize: + result += "send avg size: " + intToStr(iterMap->second) + "\n"; + break; + + case netmsgstPacketsPerMillisecondRecv: + result += "recv p / msec: " + intToStr(iterMap->second) + "\n"; + break; + case netmsgstPacketsPerSecondRecv: + result += "recv p / sec: " + intToStr(iterMap->second) + (iterMap->second > 10 ? " ****WARNING WIN32 LIMIT EXCEEDED****" : "") + "\n"; + break; + case netmsgstAverageRecvSize: + result += "recv avg size: " + intToStr(iterMap->second) + "\n"; + break; + + } + } + return result; +} + +void NetworkMessage::dump_packet(string label, const void* data, int dataSize, bool isSend) { + Config &config = Config::getInstance(); + if( config.getBool("DebugNetworkPacketStats","false") == true) { + + MutexSafeWrapper safeMutex(NetworkMessage::mutexMessageStats.get()); + + if(NetworkMessage::statsTimer.isStarted() == false) { + NetworkMessage::statsTimer.start(); + } + + bool secondChanged = false; + if(NetworkMessage::statsTimer.getSeconds() - NetworkMessage::mapMessageStats[netmsgstLastEvent] >= 3) { + + NetworkMessage::mapMessageStats[netmsgstLastEvent] = NetworkMessage::statsTimer.getSeconds(); + secondChanged = true; + } + + if(isSend == true) { + if(NetworkMessage::lastSend.isStarted() == false) { + NetworkMessage::lastSend.start(); + } + int64 millisecondsSinceLastSend = NetworkMessage::lastSend.getMillis(); + int64 secondsSinceLastSend = NetworkMessage::lastSend.getSeconds(); + + //char szBuf[8096]=""; + //snprintf(szBuf,8095,"\nSEND check cur [%lld] last [%lld]\n", (long long)millisecondsSinceLastSend,(long long)NetworkMessage::mapMessageStats[netmsgstPacketsPerMillisecondSend_last] ); + //printf("%s",szBuf); + + if(millisecondsSinceLastSend == NetworkMessage::mapMessageStats[netmsgstPacketsPerMillisecondSend_last]) { + NetworkMessage::mapMessageStats[netmsgstPacketsPerMillisecondSend_current_count]++; + + } + else { + NetworkMessage::mapMessageStats[netmsgstPacketsPerMillisecondSend_last] = millisecondsSinceLastSend; + NetworkMessage::mapMessageStats[netmsgstPacketsPerMillisecondSend] = + (NetworkMessage::mapMessageStats[netmsgstPacketsPerMillisecondSend] + + NetworkMessage::mapMessageStats[netmsgstPacketsPerMillisecondSend_current_count]) / 2; + } + + if(secondsSinceLastSend == NetworkMessage::mapMessageStats[netmsgstPacketsPerSecondSend_last]) { + NetworkMessage::mapMessageStats[netmsgstPacketsPerSecondSend_current_count]++; + + } + else { + NetworkMessage::mapMessageStats[netmsgstPacketsPerSecondSend_last] = secondsSinceLastSend; + NetworkMessage::mapMessageStats[netmsgstPacketsPerSecondSend] = + (NetworkMessage::mapMessageStats[netmsgstPacketsPerSecondSend] + + NetworkMessage::mapMessageStats[netmsgstPacketsPerSecondSend_current_count]) / 2; + } + + NetworkMessage::mapMessageStats[netmsgstAverageSendSize] = + (NetworkMessage::mapMessageStats[netmsgstAverageSendSize] + + dataSize) / 2; + } + else { + if(NetworkMessage::lastRecv.isStarted() == false) { + NetworkMessage::lastRecv.start(); + } + int64 millisecondsSinceLastRecv = NetworkMessage::lastRecv.getMillis(); + int64 secondsSinceLastRecv = NetworkMessage::lastRecv.getSeconds(); + + //char szBuf[8096]=""; + //snprintf(szBuf,8095,"\nRECV check cur [%lld] last [%lld]\n", (long long)millisecondsSinceLastRecv,(long long)NetworkMessage::mapMessageStats[netmsgstPacketsPerMillisecondRecv_last] ); + //printf("%s",szBuf); + + if(millisecondsSinceLastRecv == NetworkMessage::mapMessageStats[netmsgstPacketsPerMillisecondRecv_last]) { + NetworkMessage::mapMessageStats[netmsgstPacketsPerMillisecondRecv_current_count]++; + + } + else { + NetworkMessage::mapMessageStats[netmsgstPacketsPerMillisecondRecv_last] = millisecondsSinceLastRecv; + NetworkMessage::mapMessageStats[netmsgstPacketsPerMillisecondRecv] = + (NetworkMessage::mapMessageStats[netmsgstPacketsPerMillisecondRecv] + + NetworkMessage::mapMessageStats[netmsgstPacketsPerMillisecondRecv_current_count]) / 2; + } + + if(secondsSinceLastRecv == NetworkMessage::mapMessageStats[netmsgstPacketsPerSecondRecv_last]) { + NetworkMessage::mapMessageStats[netmsgstPacketsPerSecondRecv_current_count]++; + + } + else { + NetworkMessage::mapMessageStats[netmsgstPacketsPerSecondRecv_last] = secondsSinceLastRecv; + NetworkMessage::mapMessageStats[netmsgstPacketsPerSecondRecv] = + (NetworkMessage::mapMessageStats[netmsgstPacketsPerSecondRecv] + + NetworkMessage::mapMessageStats[netmsgstPacketsPerSecondRecv_current_count]) / 2; + } + + NetworkMessage::mapMessageStats[netmsgstAverageRecvSize] = + (NetworkMessage::mapMessageStats[netmsgstAverageRecvSize] + + dataSize) / 2; + } + + if(secondChanged == true) { + printf("%s",NetworkMessage::getNetworkPacketStats().c_str()); + } + } + + if( config.getBool("DebugNetworkPackets","false") == true || + config.getBool("DebugNetworkPacketSizes","false") == true) { + + printf("%s DataSize = %d",label.c_str(),dataSize); + + if(config.getBool("DebugNetworkPackets","false") == true) { + + printf("\n"); + const char *buf = static_cast(data); + for(unsigned int index = 0; index < (unsigned int)dataSize; ++index) { + + printf("%u[%X][%d] ",index,buf[index],buf[index]); + if(index % 10 == 0) { + printf("\n"); + } } } - printf("\n== END ==\n"); + printf("\n======= END =======\n"); } } diff --git a/source/glest_game/network/network_message.h b/source/glest_game/network/network_message.h index af6d5511..d94fb42f 100644 --- a/source/glest_game/network/network_message.h +++ b/source/glest_game/network/network_message.h @@ -16,6 +16,7 @@ #include "game_constants.h" #include "network_types.h" #include "byte_order.h" +#include #include "leak_dumper.h" @@ -66,15 +67,52 @@ static const int maxLanguageStringSize= 60; // class NetworkMessage // ===================================================== +enum NetworkMessageStatisticType { + netmsgstPacketsPerMillisecondSend, + netmsgstPacketsPerMillisecondSend_current_count, + netmsgstPacketsPerMillisecondSend_last, + + netmsgstPacketsPerSecondSend, + netmsgstPacketsPerSecondSend_current_count, + netmsgstPacketsPerSecondSend_last, + + netmsgstAverageSendSize, + + // --------------------------------------------- + netmsgstPacketsPerMillisecondRecv, + netmsgstPacketsPerMillisecondRecv_current_count, + netmsgstPacketsPerMillisecondRecv_last, + + netmsgstPacketsPerSecondRecv, + netmsgstPacketsPerSecondRecv_current_count, + netmsgstPacketsPerSecondRecv_last, + + netmsgstAverageRecvSize, + + netmsgstLastEvent + +}; + class NetworkMessage { +private: + + static auto_ptr mutexMessageStats; + static Chrono statsTimer; + static Chrono lastSend; + static Chrono lastRecv; + static std::map mapMessageStats; + public: + static void resetNetworkPacketStats(); + static string getNetworkPacketStats(); + static bool useOldProtocol; virtual ~NetworkMessage(){} virtual bool receive(Socket* socket)= 0; virtual void send(Socket* socket) = 0; virtual size_t getDataSize() const = 0; - void dump_packet(string label, const void* data, int dataSize); + void dump_packet(string label, const void* data, int dataSize, bool isSend); protected: //bool peek(Socket* socket, void* data, int dataSize); diff --git a/source/shared_lib/include/platform/sdl/platform_main.h b/source/shared_lib/include/platform/sdl/platform_main.h index 1849306d..bd5b34f2 100644 --- a/source/shared_lib/include/platform/sdl/platform_main.h +++ b/source/shared_lib/include/platform/sdl/platform_main.h @@ -93,6 +93,8 @@ const char *GAME_ARGS[] = { "--disable-opengl-checks", "--disable-streflop-checks", "--debug-network-packets", + "--debug-network-packet-sizes", + "--debug-network-packet-stats", "--enable-new-protocol", "--create-data-archives", @@ -175,6 +177,8 @@ enum GAME_ARG_TYPE { GAME_ARG_DISABLE_STREFLOP_CAPS_CHECK, GAME_ARG_DEBUG_NETWORK_PACKETS, + GAME_ARG_DEBUG_NETWORK_PACKET_SIZES, + GAME_ARG_DEBUG_NETWORK_PACKET_STATS, GAME_ARG_ENABLE_NEW_PROTOCOL, GAME_ARG_CREATE_DATA_ARCHIVES, diff --git a/source/shared_lib/sources/platform/posix/socket.cpp b/source/shared_lib/sources/platform/posix/socket.cpp index f57755e4..9a848d46 100644 --- a/source/shared_lib/sources/platform/posix/socket.cpp +++ b/source/shared_lib/sources/platform/posix/socket.cpp @@ -89,6 +89,21 @@ Mutex UPNP_Tools::mutexUPNP; #ifdef WIN32 +void DisablePacketThrottling() { + //Open the registry key. + wstring subKey = L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Multimedia\\SystemProfile"; + HKEY keyHandle; + DWORD dwDisposition; + RegCreateKeyEx(HKEY_CURRENT_USER,subKey.c_str(),0, NULL, 0, KEY_ALL_ACCESS, NULL, &keyHandle, &dwDisposition); + //Set the value. + + DWORD disableThrottle = 0xffffffff; + DWORD len = sizeof(disableThrottle); + RegSetValueEx(keyHandle, l"NetworkThrottlingIndex", 0, REG_DWORD, &disableThrottle, len); + RegCloseKey(keyHandle); +} + + #define socklen_t int #define MAXHOSTNAME 254 @@ -227,6 +242,7 @@ Mutex UPNP_Tools::mutexUPNP; SocketManager Socket::wsaManager; SocketManager::SocketManager() { + DisablePacketThrottling(); WSADATA wsaData; WORD wVersionRequested = MAKEWORD(2, 0); if(SystemFlags::VERBOSE_MODE_ENABLED) printf("SocketManager calling WSAStartup...\n");