- attempt to disable packet throttling on windows
- added some network packet debug code
This commit is contained in:
parent
21a12a6c72
commit
676a6071fa
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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");
|
||||
|
|
Loading…
Reference in New Issue