- attempt to disable packet throttling on windows

- added some network packet debug code
This commit is contained in:
SoftCoder 2014-01-01 10:59:55 -08:00
parent 21a12a6c72
commit 676a6071fa
6 changed files with 229 additions and 15 deletions

View File

@ -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;

View File

@ -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) {

View File

@ -33,6 +33,12 @@ namespace Glest{ namespace Game{
bool NetworkMessage::useOldProtocol = true;
auto_ptr<Mutex> NetworkMessage::mutexMessageStats(new Mutex(CODE_AT_LINE));
Chrono NetworkMessage::statsTimer;
Chrono NetworkMessage::lastSend;
Chrono NetworkMessage::lastRecv;
std::map<NetworkMessageStatisticType,int64> 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<const char *>(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<NetworkMessageStatisticType,int64>::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<const char *>(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");
}
}

View File

@ -16,6 +16,7 @@
#include "game_constants.h"
#include "network_types.h"
#include "byte_order.h"
#include <map>
#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<Mutex> mutexMessageStats;
static Chrono statsTimer;
static Chrono lastSend;
static Chrono lastRecv;
static std::map<NetworkMessageStatisticType,int64> 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);

View File

@ -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,

View File

@ -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");