- attempt to fix socket issues causing hangs

This commit is contained in:
SoftCoder 2015-12-25 23:12:00 -08:00
parent c9fb0160dc
commit 9792b9695b
6 changed files with 423 additions and 194 deletions

View File

@ -872,7 +872,7 @@ void ClientInterface::updateLobby() {
//printf("#1 Got new game setup playerIndex = %d!\n",playerIndex); //printf("#1 Got new game setup playerIndex = %d!\n",playerIndex);
NetworkMessageLaunch networkMessageLaunch; NetworkMessageLaunch networkMessageLaunch;
if(receiveMessage(&networkMessageLaunch)) { if(receiveMessage(&networkMessageLaunch, networkMessageType)) {
this->setLastPingInfoToNow(); this->setLastPingInfoToNow();
if(networkMessageLaunch.getMessageType() == nmtLaunch) { if(networkMessageLaunch.getMessageType() == nmtLaunch) {
@ -1232,7 +1232,7 @@ void ClientInterface::updateFrame(int *checkFrame) {
//printf("#2 Got new game setup playerIndex = %d!\n",playerIndex); //printf("#2 Got new game setup playerIndex = %d!\n",playerIndex);
NetworkMessageLaunch networkMessageLaunch; NetworkMessageLaunch networkMessageLaunch;
if(receiveMessage(&networkMessageLaunch)) { if(receiveMessage(&networkMessageLaunch,networkMessageType)) {
if(networkMessageLaunch.getMessageType() == nmtLaunch) { if(networkMessageLaunch.getMessageType() == nmtLaunch) {
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Lined: %d] got nmtLaunch\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Lined: %d] got nmtLaunch\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__);

View File

@ -117,11 +117,11 @@ void NetworkInterface::sendMessage(NetworkMessage* networkMessage){
networkMessage->send(socket); networkMessage->send(socket);
} }
NetworkMessageType NetworkInterface::getNextMessageType(int waitMilliseconds) NetworkMessageType NetworkInterface::getNextMessageType(int waitMilliseconds) {
{
Socket* socket= getSocket(false); Socket* socket= getSocket(false);
int8 messageType= nmtInvalid; int8 messageType= nmtInvalid;
/*
if(socket != NULL && if(socket != NULL &&
((waitMilliseconds <= 0 && socket->hasDataToRead() == true) || ((waitMilliseconds <= 0 && socket->hasDataToRead() == true) ||
(waitMilliseconds > 0 && socket->hasDataToReadWithWait(waitMilliseconds) == true))) { (waitMilliseconds > 0 && socket->hasDataToReadWithWait(waitMilliseconds) == true))) {
@ -150,10 +150,54 @@ NetworkMessageType NetworkInterface::getNextMessageType(int waitMilliseconds)
} }
return static_cast<NetworkMessageType>(messageType); return static_cast<NetworkMessageType>(messageType);
*/
// According to here: https://support.microsoft.com/en-us/kb/192599
// its a terrible sin to use MSG_PEEK so lets try an alternative
/*
int bytesReceived = socket->receive(&messageType, sizeof(messageType), true);
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] socket->getDataToRead() iPeek = %d, messageType = %d [size = %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,bytesReceived,messageType,sizeof(messageType));
return static_cast<NetworkMessageType>(messageType);
*/
if(socket != NULL &&
((waitMilliseconds <= 0 && socket->hasDataToRead() == true) ||
(waitMilliseconds > 0 && socket->hasDataToReadWithWait(waitMilliseconds) == true))) {
//peek message type
int dataSize = socket->getDataToRead();
if(dataSize >= (int)sizeof(messageType)) {
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] socket->getDataToRead() dataSize = %d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,dataSize);
//int iPeek = socket->peek(&messageType, sizeof(messageType));
//if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] socket->getDataToRead() iPeek = %d, messageType = %d [size = %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,iPeek,messageType,sizeof(messageType));
int bytesReceived = socket->receive(&messageType, sizeof(messageType), true);
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] socket->getDataToRead() iPeek = %d, messageType = %d [size = %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,bytesReceived,messageType,sizeof(messageType));
}
else {
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] PEEK WARNING, socket->getDataToRead() messageType = %d [size = %d], dataSize = %d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,messageType,sizeof(messageType),dataSize);
}
//sanity check new message type
if(messageType < 0 || messageType >= nmtCount) {
if(getConnectHasHandshaked() == true) {
throw megaglest_runtime_error("Invalid message type: " + intToStr(messageType));
}
else {
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] Invalid message type = %d (no packet handshake yet so ignored)\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,messageType);
}
}
}
return static_cast<NetworkMessageType>(messageType);
} }
bool NetworkInterface::receiveMessage(NetworkMessage* networkMessage){ bool NetworkInterface::receiveMessage(NetworkMessage* networkMessage){
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__); if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__);
Socket* socket= getSocket(false); Socket* socket= getSocket(false);
@ -161,6 +205,14 @@ bool NetworkInterface::receiveMessage(NetworkMessage* networkMessage){
return networkMessage->receive(socket); return networkMessage->receive(socket);
} }
bool NetworkInterface::receiveMessage(NetworkMessage* networkMessage, NetworkMessageType type) {
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__);
Socket* socket = getSocket(false);
return networkMessage->receive(socket, type);
}
bool NetworkInterface::isConnected(){ bool NetworkInterface::isConnected(){
bool result = (getSocket()!=NULL && getSocket()->isConnected()); bool result = (getSocket()!=NULL && getSocket()->isConnected());
return result; return result;

View File

@ -238,6 +238,7 @@ public:
virtual void sendMessage(NetworkMessage* networkMessage); virtual void sendMessage(NetworkMessage* networkMessage);
NetworkMessageType getNextMessageType(int waitMilliseconds=0); NetworkMessageType getNextMessageType(int waitMilliseconds=0);
bool receiveMessage(NetworkMessage* networkMessage); bool receiveMessage(NetworkMessage* networkMessage);
bool receiveMessage(NetworkMessage* networkMessage, NetworkMessageType type);
virtual bool isConnected(); virtual bool isConnected();

File diff suppressed because it is too large Load Diff

View File

@ -109,13 +109,17 @@ public:
static bool useOldProtocol; static bool useOldProtocol;
virtual ~NetworkMessage(){} virtual ~NetworkMessage(){}
virtual bool receive(Socket* socket)= 0; virtual bool receive(Socket* socket)= 0;
virtual bool receive(Socket* socket, NetworkMessageType type) { return receive(socket); };
virtual void send(Socket* socket) = 0; virtual void send(Socket* socket) = 0;
virtual size_t getDataSize() const = 0; virtual size_t getDataSize() const = 0;
virtual NetworkMessageType getNetworkMessageType() const = 0;
void dump_packet(string label, const void* data, int dataSize, bool isSend); void dump_packet(string label, const void* data, int dataSize, bool isSend);
protected: protected:
//bool peek(Socket* socket, void* data, int dataSize);
bool receive(Socket* socket, void* data, int dataSize,bool tryReceiveUntilDataSizeMet); bool receive(Socket* socket, void* data, int dataSize,bool tryReceiveUntilDataSizeMet);
void send(Socket* socket, const void* data, int dataSize); void send(Socket* socket, const void* data, int dataSize);
@ -140,8 +144,8 @@ private:
static const int maxSmallStringSize= 60; static const int maxSmallStringSize= 60;
private: private:
int8 messageType;
struct Data { struct Data {
int8 messageType;
int32 sessionId; int32 sessionId;
NetworkString<maxVersionStringSize> versionString; NetworkString<maxVersionStringSize> versionString;
NetworkString<maxNameSize> name; NetworkString<maxNameSize> name;
@ -154,6 +158,7 @@ private:
NetworkString<maxSmallStringSize> playerUUID; NetworkString<maxSmallStringSize> playerUUID;
NetworkString<maxSmallStringSize> platform; NetworkString<maxSmallStringSize> platform;
}; };
void toEndian(); void toEndian();
void fromEndian(); void fromEndian();
@ -175,9 +180,12 @@ public:
virtual void unpackMessage(unsigned char *buf); virtual void unpackMessage(unsigned char *buf);
virtual unsigned char * packMessage(); virtual unsigned char * packMessage();
virtual size_t getDataSize() const { return sizeof(Data); } virtual size_t getDataSize() const { return sizeof(Data); }
virtual NetworkMessageType getNetworkMessageType() const {
return nmtIntro;
}
int32 getSessionId() const { return data.sessionId;} int32 getSessionId() const { return data.sessionId;}
string getVersionString() const { return data.versionString.getString(); } string getVersionString() const { return data.versionString.getString(); }
string getName() const { return data.name.getString(); } string getName() const { return data.name.getString(); }
@ -207,8 +215,8 @@ public:
#pragma pack(push, 1) #pragma pack(push, 1)
class NetworkMessagePing: public NetworkMessage{ class NetworkMessagePing: public NetworkMessage{
private: private:
int8 messageType;
struct Data{ struct Data{
int8 messageType;
int32 pingFrequency; int32 pingFrequency;
int64 pingTime; int64 pingTime;
}; };
@ -231,6 +239,10 @@ public:
virtual size_t getDataSize() const { return sizeof(Data); } virtual size_t getDataSize() const { return sizeof(Data); }
virtual NetworkMessageType getNetworkMessageType() const {
return nmtPing;
}
int32 getPingFrequency() const {return data.pingFrequency;} int32 getPingFrequency() const {return data.pingFrequency;}
int64 getPingTime() const {return data.pingTime;} int64 getPingTime() const {return data.pingTime;}
int64 getPingReceivedLocalTime() const { return pingReceivedLocalTime; } int64 getPingReceivedLocalTime() const { return pingReceivedLocalTime; }
@ -250,8 +262,8 @@ public:
#pragma pack(push, 1) #pragma pack(push, 1)
class NetworkMessageReady: public NetworkMessage{ class NetworkMessageReady: public NetworkMessage{
private: private:
int8 messageType;
struct Data{ struct Data{
int8 messageType;
uint32 checksum; uint32 checksum;
}; };
void toEndian(); void toEndian();
@ -272,6 +284,10 @@ public:
virtual size_t getDataSize() const { return sizeof(Data); } virtual size_t getDataSize() const { return sizeof(Data); }
virtual NetworkMessageType getNetworkMessageType() const {
return nmtReady;
}
uint32 getChecksum() const {return data.checksum;} uint32 getChecksum() const {return data.checksum;}
virtual bool receive(Socket* socket); virtual bool receive(Socket* socket);
@ -294,8 +310,9 @@ private:
static const int maxFactionCRCCount= 20; static const int maxFactionCRCCount= 20;
private: private:
int8 messageType;
struct Data{ struct Data{
int8 messageType;
NetworkString<maxStringSize> description; NetworkString<maxStringSize> description;
NetworkString<maxSmallStringSize> map; NetworkString<maxSmallStringSize> map;
NetworkString<maxSmallStringSize> tileset; NetworkString<maxSmallStringSize> tileset;
@ -362,8 +379,12 @@ public:
virtual size_t getDataSize() const { return sizeof(Data); } virtual size_t getDataSize() const { return sizeof(Data); }
virtual NetworkMessageType getNetworkMessageType() const {
return nmtLaunch;
}
void buildGameSettings(GameSettings *gameSettings) const; void buildGameSettings(GameSettings *gameSettings) const;
int getMessageType() const { return data.messageType; } int getMessageType() const { return messageType; }
int getMapCRC() const { return data.mapCRC; } int getMapCRC() const { return data.mapCRC; }
int getTilesetCRC() const { return data.tilesetCRC; } int getTilesetCRC() const { return data.tilesetCRC; }
@ -371,6 +392,8 @@ public:
vector<pair<string,uint32> > getFactionCRCList() const; vector<pair<string,uint32> > getFactionCRCList() const;
virtual bool receive(Socket* socket); virtual bool receive(Socket* socket);
virtual bool receive(Socket* socket, NetworkMessageType type);
virtual void send(Socket* socket); virtual void send(Socket* socket);
}; };
#pragma pack(pop) #pragma pack(pop)
@ -385,8 +408,9 @@ public:
class NetworkMessageCommandList: public NetworkMessage { class NetworkMessageCommandList: public NetworkMessage {
private: private:
struct DataHeader { struct DataHeader {
int8 messageType;
uint16 commandCount; uint16 commandCount;
int32 frameCount; int32 frameCount;
uint32 networkPlayerFactionCRC[GameConstants::maxPlayers]; uint32 networkPlayerFactionCRC[GameConstants::maxPlayers];
@ -395,11 +419,12 @@ private:
static const int32 commandListHeaderSize = sizeof(DataHeader); static const int32 commandListHeaderSize = sizeof(DataHeader);
struct Data { struct Data {
int8 messageType;
DataHeader header; DataHeader header;
std::vector<NetworkCommand> commands; std::vector<NetworkCommand> commands;
}; };
void init(Data &data_ref) { void init(Data &data_ref) {
data_ref.header.messageType = 0; data_ref.messageType = 0;
data_ref.header.commandCount = 0; data_ref.header.commandCount = 0;
data_ref.header.frameCount = 0; data_ref.header.frameCount = 0;
for(int index = 0; index < GameConstants::maxPlayers; ++index) { for(int index = 0; index < GameConstants::maxPlayers; ++index) {
@ -435,6 +460,10 @@ public:
virtual size_t getDataSize() const { return sizeof(Data); } virtual size_t getDataSize() const { return sizeof(Data); }
virtual NetworkMessageType getNetworkMessageType() const {
return nmtCommandList;
}
bool addCommand(const NetworkCommand* networkCommand); bool addCommand(const NetworkCommand* networkCommand);
void clear() {data.header.commandCount= 0;} void clear() {data.header.commandCount= 0;}
@ -462,8 +491,9 @@ private:
static const int maxTextStringSize= 500; static const int maxTextStringSize= 500;
private: private:
int8 messageType;
struct Data{ struct Data{
int8 messageType;
NetworkString<maxTextStringSize> text; NetworkString<maxTextStringSize> text;
int8 teamIndex; int8 teamIndex;
int8 playerIndex; int8 playerIndex;
@ -488,6 +518,10 @@ public:
virtual size_t getDataSize() const { return sizeof(Data); } virtual size_t getDataSize() const { return sizeof(Data); }
virtual NetworkMessageType getNetworkMessageType() const {
return nmtText;
}
string getText() const {return data.text.getString();} string getText() const {return data.text.getString();}
int getTeamIndex() const {return data.teamIndex;} int getTeamIndex() const {return data.teamIndex;}
int getPlayerIndex() const {return data.playerIndex;} int getPlayerIndex() const {return data.playerIndex;}
@ -508,14 +542,16 @@ public:
#pragma pack(push, 1) #pragma pack(push, 1)
class NetworkMessageQuit: public NetworkMessage{ class NetworkMessageQuit: public NetworkMessage{
private: private:
struct Data{
int8 messageType; int8 messageType;
}; //struct Data{
// int8 messageType;
//};
void toEndian(); void toEndian();
void fromEndian(); void fromEndian();
private: private:
Data data; //Data data;
protected: protected:
virtual const char * getPackedMessageFormat() const; virtual const char * getPackedMessageFormat() const;
@ -526,7 +562,12 @@ protected:
public: public:
NetworkMessageQuit(); NetworkMessageQuit();
virtual size_t getDataSize() const { return sizeof(Data); } //virtual size_t getDataSize() const { return sizeof(Data); }
virtual size_t getDataSize() const { return 0; }
virtual NetworkMessageType getNetworkMessageType() const {
return nmtQuit;
}
virtual bool receive(Socket* socket); virtual bool receive(Socket* socket);
virtual void send(Socket* socket); virtual void send(Socket* socket);
@ -551,8 +592,6 @@ static const int maxFileCRCPacketCount= 25;
private: private:
struct DataHeader { struct DataHeader {
int8 messageType;
NetworkString<maxStringSize> map; NetworkString<maxStringSize> map;
NetworkString<maxStringSize> tileset; NetworkString<maxStringSize> tileset;
NetworkString<maxStringSize> tech; NetworkString<maxStringSize> tech;
@ -575,6 +614,7 @@ private:
static const int32 DetailSize2 = sizeof(uint32); static const int32 DetailSize2 = sizeof(uint32);
struct Data { struct Data {
int8 messageType;
DataHeader header; DataHeader header;
DataDetail detail; DataDetail detail;
}; };
@ -607,6 +647,10 @@ public:
virtual size_t getDataSize() const { return sizeof(Data); } virtual size_t getDataSize() const { return sizeof(Data); }
virtual NetworkMessageType getNetworkMessageType() const {
return nmtSynchNetworkGameData;
}
virtual bool receive(Socket* socket); virtual bool receive(Socket* socket);
virtual void send(Socket* socket); virtual void send(Socket* socket);
@ -644,8 +688,6 @@ static const uint32 maxFileCRCPacketCount= 25;
private: private:
struct DataHeader { struct DataHeader {
int8 messageType;
uint32 mapCRC; uint32 mapCRC;
uint32 tilesetCRC; uint32 tilesetCRC;
uint32 techCRC; uint32 techCRC;
@ -663,6 +705,7 @@ private:
static const int32 DetailSize2 = sizeof(uint32); static const int32 DetailSize2 = sizeof(uint32);
struct Data { struct Data {
int8 messageType;
DataHeader header; DataHeader header;
DataDetail detail; DataDetail detail;
}; };
@ -686,6 +729,10 @@ public:
virtual size_t getDataSize() const { return sizeof(Data); } virtual size_t getDataSize() const { return sizeof(Data); }
virtual NetworkMessageType getNetworkMessageType() const {
return nmtSynchNetworkGameDataStatus;
}
virtual bool receive(Socket* socket); virtual bool receive(Socket* socket);
virtual void send(Socket* socket); virtual void send(Socket* socket);
@ -716,8 +763,9 @@ private:
static const int maxStringSize= 256; static const int maxStringSize= 256;
private: private:
int8 messageType;
struct Data{ struct Data{
int8 messageType;
uint32 totalFileCount; uint32 totalFileCount;
uint32 fileIndex; uint32 fileIndex;
@ -742,6 +790,10 @@ public:
virtual size_t getDataSize() const { return sizeof(Data); } virtual size_t getDataSize() const { return sizeof(Data); }
virtual NetworkMessageType getNetworkMessageType() const {
return nmtSynchNetworkGameDataFileCRCCheck;
}
virtual bool receive(Socket* socket); virtual bool receive(Socket* socket);
virtual void send(Socket* socket); virtual void send(Socket* socket);
@ -766,8 +818,9 @@ private:
static const int maxStringSize= 256; static const int maxStringSize= 256;
private: private:
int8 messageType;
struct Data{ struct Data{
int8 messageType;
NetworkString<maxStringSize> fileName; NetworkString<maxStringSize> fileName;
}; };
@ -789,6 +842,10 @@ public:
virtual size_t getDataSize() const { return sizeof(Data); } virtual size_t getDataSize() const { return sizeof(Data); }
virtual NetworkMessageType getNetworkMessageType() const {
return nmtSynchNetworkGameDataFileGet;
}
virtual bool receive(Socket* socket); virtual bool receive(Socket* socket);
virtual void send(Socket* socket); virtual void send(Socket* socket);
@ -821,8 +878,10 @@ private:
static const int maxPlayernameStringSize= 80; static const int maxPlayernameStringSize= 80;
private: private:
int8 messageType;
struct Data { struct Data {
int8 messageType;
NetworkString<maxStringSize> selectedFactionName; //wanted faction name NetworkString<maxStringSize> selectedFactionName; //wanted faction name
int8 currentSlotIndex; int8 currentSlotIndex;
int8 toSlotIndex; int8 toSlotIndex;
@ -853,6 +912,10 @@ public:
virtual size_t getDataSize() const { return sizeof(Data); } virtual size_t getDataSize() const { return sizeof(Data); }
virtual NetworkMessageType getNetworkMessageType() const {
return nmtSwitchSetupRequest;
}
string getSelectedFactionName() const {return data.selectedFactionName.getString();} string getSelectedFactionName() const {return data.selectedFactionName.getString();}
int getCurrentSlotIndex() const {return data.currentSlotIndex;} int getCurrentSlotIndex() const {return data.currentSlotIndex;}
int getToSlotIndex() const {return data.toSlotIndex;} int getToSlotIndex() const {return data.toSlotIndex;}
@ -881,8 +944,10 @@ public:
class PlayerIndexMessage: public NetworkMessage{ class PlayerIndexMessage: public NetworkMessage{
private: private:
int8 messageType;
struct Data { struct Data {
int8 messageType;
int16 playerIndex; int16 playerIndex;
}; };
void toEndian(); void toEndian();
@ -902,6 +967,10 @@ public:
virtual size_t getDataSize() const { return sizeof(Data); } virtual size_t getDataSize() const { return sizeof(Data); }
virtual NetworkMessageType getNetworkMessageType() const {
return nmtPlayerIndexMessage;
}
int16 getPlayerIndex() const {return data.playerIndex;} int16 getPlayerIndex() const {return data.playerIndex;}
virtual bool receive(Socket* socket); virtual bool receive(Socket* socket);
@ -940,8 +1009,10 @@ enum NetworkMessageLoadingStatusType {
#pragma pack(push, 1) #pragma pack(push, 1)
class NetworkMessageLoadingStatus : public NetworkMessage { class NetworkMessageLoadingStatus : public NetworkMessage {
private: private:
int8 messageType;
struct Data { struct Data {
int8 messageType;
uint32 status; uint32 status;
}; };
void toEndian(); void toEndian();
@ -962,6 +1033,10 @@ public:
virtual size_t getDataSize() const { return sizeof(Data); } virtual size_t getDataSize() const { return sizeof(Data); }
virtual NetworkMessageType getNetworkMessageType() const {
return nmtLoadingStatusMessage;
}
uint32 getStatus() const {return data.status;} uint32 getStatus() const {return data.status;}
virtual bool receive(Socket* socket); virtual bool receive(Socket* socket);
@ -982,8 +1057,10 @@ private:
static const int maxTextStringSize= 500; static const int maxTextStringSize= 500;
private: private:
int8 messageType;
struct Data{ struct Data{
int8 messageType;
int16 targetX; int16 targetX;
int16 targetY; int16 targetY;
@ -1009,6 +1086,10 @@ public:
virtual size_t getDataSize() const { return sizeof(Data); } virtual size_t getDataSize() const { return sizeof(Data); }
virtual NetworkMessageType getNetworkMessageType() const {
return nmtMarkCell;
}
string getText() const { return data.text.getString(); } string getText() const { return data.text.getString(); }
Vec2i getTarget() const { return Vec2i(data.targetX,data.targetY); } Vec2i getTarget() const { return Vec2i(data.targetX,data.targetY); }
int getFactionIndex() const { return data.factionIndex; } int getFactionIndex() const { return data.factionIndex; }
@ -1030,8 +1111,10 @@ public:
class NetworkMessageUnMarkCell: public NetworkMessage { class NetworkMessageUnMarkCell: public NetworkMessage {
private: private:
int8 messageType;
struct Data { struct Data {
int8 messageType;
int16 targetX; int16 targetX;
int16 targetY; int16 targetY;
@ -1055,6 +1138,10 @@ public:
virtual size_t getDataSize() const { return sizeof(Data); } virtual size_t getDataSize() const { return sizeof(Data); }
virtual NetworkMessageType getNetworkMessageType() const {
return nmtUnMarkCell;
}
Vec2i getTarget() const { return Vec2i(data.targetX,data.targetY); } Vec2i getTarget() const { return Vec2i(data.targetX,data.targetY); }
int getFactionIndex() const { return data.factionIndex; } int getFactionIndex() const { return data.factionIndex; }
@ -1077,8 +1164,9 @@ private:
static const int maxTextStringSize= 500; static const int maxTextStringSize= 500;
private: private:
int8 messageType;
struct Data{ struct Data{
int8 messageType;
int16 targetX; int16 targetX;
int16 targetY; int16 targetY;
@ -1102,6 +1190,10 @@ public:
virtual size_t getDataSize() const { return sizeof(Data); } virtual size_t getDataSize() const { return sizeof(Data); }
virtual NetworkMessageType getNetworkMessageType() const {
return nmtHighlightCell;
}
Vec2i getTarget() const { return Vec2i(data.targetX,data.targetY); } Vec2i getTarget() const { return Vec2i(data.targetX,data.targetY); }
int getFactionIndex() const { return data.factionIndex; } int getFactionIndex() const { return data.factionIndex; }

View File

@ -1406,18 +1406,22 @@ int Socket::receive(void *data, int dataSize, bool tryReceiveUntilDataSizeMet) {
else if(bytesReceived < 0 && lastSocketError == PLATFORM_SOCKET_TRY_AGAIN) { else if(bytesReceived < 0 && lastSocketError == PLATFORM_SOCKET_TRY_AGAIN) {
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] #1 EAGAIN during receive, trying again...\n",__FILE__,__FUNCTION__,__LINE__); if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] #1 EAGAIN during receive, trying again...\n",__FILE__,__FUNCTION__,__LINE__);
Chrono chronoElapsed(true);
const int MAX_RECV_WAIT_SECONDS = 3; const int MAX_RECV_WAIT_SECONDS = 3;
time_t tStartTimer = time(NULL); time_t tStartTimer = time(NULL);
while((bytesReceived < 0 && lastSocketError == PLATFORM_SOCKET_TRY_AGAIN) && while((bytesReceived < 0 && lastSocketError == PLATFORM_SOCKET_TRY_AGAIN) &&
(difftime((long int)time(NULL),tStartTimer) <= MAX_RECV_WAIT_SECONDS)) { (difftime((long int)time(NULL),tStartTimer) <= MAX_RECV_WAIT_SECONDS)) {
if(isConnected() == false) { if(isConnected() == false) {
int iErr = getLastSocketError(); if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"[%s::%s Line: %d] Socket is NOT connected!\n",__FILE__,__FUNCTION__,__LINE__);
int iErr = getLastSocketError();
disconnectSocket(); disconnectSocket();
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"[%s::%s Line: %d] DISCONNECTED SOCKET error while receiving socket data, bytesSent = %d, error = %s\n",__FILE__,__FUNCTION__,__LINE__,bytesReceived,getLastSocketErrorFormattedText(&iErr).c_str()); if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"[%s::%s Line: %d] DISCONNECTED SOCKET error while receiving socket data, bytesSent = %d, error = %s\n",__FILE__,__FUNCTION__,__LINE__,bytesReceived,getLastSocketErrorFormattedText(&iErr).c_str());
break; break;
} }
else if(Socket::isReadable(true) == true) { //else if(Socket::isReadable(true) == true) {
else {
// MutexSafeWrapper safeMutexSocketDestructorFlag(&inSocketDestructorSynchAccessor,CODE_AT_LINE); // MutexSafeWrapper safeMutexSocketDestructorFlag(&inSocketDestructorSynchAccessor,CODE_AT_LINE);
// if(this->inSocketDestructor == true) { // if(this->inSocketDestructor == true) {
// SystemFlags::OutputDebug(SystemFlags::debugError,"In [%s::%s Line: %d] this->inSocketDestructor == true\n",__FILE__,__FUNCTION__,__LINE__); // SystemFlags::OutputDebug(SystemFlags::debugError,"In [%s::%s Line: %d] this->inSocketDestructor == true\n",__FILE__,__FUNCTION__,__LINE__);
@ -1426,17 +1430,37 @@ int Socket::receive(void *data, int dataSize, bool tryReceiveUntilDataSizeMet) {
// inSocketDestructorSynchAccessor->setOwnerId(CODE_AT_LINE); // inSocketDestructorSynchAccessor->setOwnerId(CODE_AT_LINE);
// safeMutexSocketDestructorFlag.ReleaseLock(); // safeMutexSocketDestructorFlag.ReleaseLock();
MutexSafeWrapper safeMutex(dataSynchAccessorRead,CODE_AT_LINE); //if(chronoElapsed.getMillis() % 2 == 0) {
bytesReceived = recv(sock, reinterpret_cast<char*>(data), dataSize, 0); // sleep(0);
lastSocketError = getLastSocketError(); //}
safeMutex.ReleaseLock(); if(Socket::isReadable(true) == true) {
MutexSafeWrapper safeMutex(dataSynchAccessorRead,CODE_AT_LINE);
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] #2 EAGAIN during receive, trying again returned: %d\n",__FILE__,__FUNCTION__,__LINE__,bytesReceived); //SafeSocketBlockToggleWrapper safeBlock(this, true);
errno = 0;
bytesReceived = recv(sock, reinterpret_cast<char*>(data), dataSize, 0);
lastSocketError = getLastSocketError();
//safeBlock.Restore();
safeMutex.ReleaseLock();
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] #2 EAGAIN during receive, trying again returned: %d, lastSocketError = %d, dataSize = %d\n",__FILE__,__FUNCTION__,__LINE__,bytesReceived,lastSocketError,(int)dataSize);
printf("In [%s::%s Line: %d] #2 EAGAIN during receive, trying again returned: %d, lastSocketError = %d, dataSize = %d\n",__FILE__,__FUNCTION__,__LINE__,bytesReceived,lastSocketError,(int)dataSize);
}
else {
if(chronoElapsed.getMillis() % 3 == 0) {
sleep(1);
}
else {
sleep(0);
}
}
} }
} }
} }
if(bytesReceived <= 0) { if(bytesReceived <= 0) {
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] bytesReceived = %d\n",__FILE__,__FUNCTION__,__LINE__,bytesReceived);
int iErr = getLastSocketError(); int iErr = getLastSocketError();
disconnectSocket(); disconnectSocket();
@ -1524,14 +1548,14 @@ int Socket::peek(void *data, int dataSize,bool mustGetData,int *pLastSocketError
//if(chrono.getMillis() > 1) printf("In [%s::%s Line: %d] action running for msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,(long long int)chrono.getMillis()); //if(chrono.getMillis() > 1) printf("In [%s::%s Line: %d] action running for msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,(long long int)chrono.getMillis());
if(isSocketValid() == true) { if(isSocketValid() == true) {
// Chrono recvTimer(true); // Chrono recvTimer(true);
//SafeSocketBlockToggleWrapper safeUnblock(this, false); SafeSocketBlockToggleWrapper safeUnblock(this, false);
errno = 0; errno = 0;
err = recv(sock, reinterpret_cast<char*>(data), dataSize, MSG_PEEK); err = recv(sock, reinterpret_cast<char*>(data), dataSize, MSG_PEEK);
lastSocketError = getLastSocketError(); lastSocketError = getLastSocketError();
if(pLastSocketError != NULL) { if(pLastSocketError != NULL) {
*pLastSocketError = lastSocketError; *pLastSocketError = lastSocketError;
} }
//safeUnblock.Restore(); safeUnblock.Restore();
// if(recvTimer.getMillis() > 1000 || (err <= 0 && lastSocketError != 0 && lastSocketError != PLATFORM_SOCKET_TRY_AGAIN)) { // if(recvTimer.getMillis() > 1000 || (err <= 0 && lastSocketError != 0 && lastSocketError != PLATFORM_SOCKET_TRY_AGAIN)) {
// printf("#1 PEEK err = %d lastSocketError = %d ms: %lld\n",err,lastSocketError,(long long int)recvTimer.getMillis()); // printf("#1 PEEK err = %d lastSocketError = %d ms: %lld\n",err,lastSocketError,(long long int)recvTimer.getMillis());
@ -1588,14 +1612,14 @@ int Socket::peek(void *data, int dataSize,bool mustGetData,int *pLastSocketError
MutexSafeWrapper safeMutex(dataSynchAccessorRead,CODE_AT_LINE); MutexSafeWrapper safeMutex(dataSynchAccessorRead,CODE_AT_LINE);
// Chrono recvTimer(true); // Chrono recvTimer(true);
//SafeSocketBlockToggleWrapper safeUnblock(this, false); SafeSocketBlockToggleWrapper safeUnblock(this, false);
errno = 0; errno = 0;
err = recv(sock, reinterpret_cast<char*>(data), dataSize, MSG_PEEK); err = recv(sock, reinterpret_cast<char*>(data), dataSize, MSG_PEEK);
lastSocketError = getLastSocketError(); lastSocketError = getLastSocketError();
if(pLastSocketError != NULL) { if(pLastSocketError != NULL) {
*pLastSocketError = lastSocketError; *pLastSocketError = lastSocketError;
} }
//safeUnblock.Restore(); safeUnblock.Restore();
// if(recvTimer.getMillis() > 1000 || (err <= 0 && lastSocketError != 0 && lastSocketError != PLATFORM_SOCKET_TRY_AGAIN)) { // if(recvTimer.getMillis() > 1000 || (err <= 0 && lastSocketError != 0 && lastSocketError != PLATFORM_SOCKET_TRY_AGAIN)) {
// printf("#2 PEEK err = %d lastSocketError = %d ms: %lld\n",err,lastSocketError,(long long int)recvTimer.getMillis()); // printf("#2 PEEK err = %d lastSocketError = %d ms: %lld\n",err,lastSocketError,(long long int)recvTimer.getMillis());