- attempt to fix socket issues causing hangs
This commit is contained in:
parent
c9fb0160dc
commit
9792b9695b
|
@ -872,7 +872,7 @@ void ClientInterface::updateLobby() {
|
|||
//printf("#1 Got new game setup playerIndex = %d!\n",playerIndex);
|
||||
|
||||
NetworkMessageLaunch networkMessageLaunch;
|
||||
if(receiveMessage(&networkMessageLaunch)) {
|
||||
if(receiveMessage(&networkMessageLaunch, networkMessageType)) {
|
||||
this->setLastPingInfoToNow();
|
||||
|
||||
if(networkMessageLaunch.getMessageType() == nmtLaunch) {
|
||||
|
@ -1232,7 +1232,7 @@ void ClientInterface::updateFrame(int *checkFrame) {
|
|||
//printf("#2 Got new game setup playerIndex = %d!\n",playerIndex);
|
||||
|
||||
NetworkMessageLaunch networkMessageLaunch;
|
||||
if(receiveMessage(&networkMessageLaunch)) {
|
||||
if(receiveMessage(&networkMessageLaunch,networkMessageType)) {
|
||||
|
||||
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__);
|
||||
|
|
|
@ -117,11 +117,11 @@ void NetworkInterface::sendMessage(NetworkMessage* networkMessage){
|
|||
networkMessage->send(socket);
|
||||
}
|
||||
|
||||
NetworkMessageType NetworkInterface::getNextMessageType(int waitMilliseconds)
|
||||
{
|
||||
NetworkMessageType NetworkInterface::getNextMessageType(int waitMilliseconds) {
|
||||
Socket* socket= getSocket(false);
|
||||
int8 messageType= nmtInvalid;
|
||||
|
||||
/*
|
||||
if(socket != NULL &&
|
||||
((waitMilliseconds <= 0 && socket->hasDataToRead() == true) ||
|
||||
(waitMilliseconds > 0 && socket->hasDataToReadWithWait(waitMilliseconds) == true))) {
|
||||
|
@ -150,10 +150,54 @@ NetworkMessageType NetworkInterface::getNextMessageType(int waitMilliseconds)
|
|||
}
|
||||
|
||||
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){
|
||||
|
||||
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__);
|
||||
|
||||
Socket* socket= getSocket(false);
|
||||
|
@ -161,6 +205,14 @@ bool NetworkInterface::receiveMessage(NetworkMessage* networkMessage){
|
|||
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 result = (getSocket()!=NULL && getSocket()->isConnected());
|
||||
return result;
|
||||
|
|
|
@ -238,6 +238,7 @@ public:
|
|||
virtual void sendMessage(NetworkMessage* networkMessage);
|
||||
NetworkMessageType getNextMessageType(int waitMilliseconds=0);
|
||||
bool receiveMessage(NetworkMessage* networkMessage);
|
||||
bool receiveMessage(NetworkMessage* networkMessage, NetworkMessageType type);
|
||||
|
||||
virtual bool isConnected();
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -109,13 +109,17 @@ public:
|
|||
static bool useOldProtocol;
|
||||
virtual ~NetworkMessage(){}
|
||||
virtual bool receive(Socket* socket)= 0;
|
||||
virtual bool receive(Socket* socket, NetworkMessageType type) { return receive(socket); };
|
||||
|
||||
virtual void send(Socket* socket) = 0;
|
||||
virtual size_t getDataSize() const = 0;
|
||||
|
||||
virtual NetworkMessageType getNetworkMessageType() const = 0;
|
||||
|
||||
void dump_packet(string label, const void* data, int dataSize, bool isSend);
|
||||
|
||||
protected:
|
||||
|
||||
//bool peek(Socket* socket, void* data, int dataSize);
|
||||
bool receive(Socket* socket, void* data, int dataSize,bool tryReceiveUntilDataSizeMet);
|
||||
void send(Socket* socket, const void* data, int dataSize);
|
||||
|
||||
|
@ -140,8 +144,8 @@ private:
|
|||
static const int maxSmallStringSize= 60;
|
||||
|
||||
private:
|
||||
int8 messageType;
|
||||
struct Data {
|
||||
int8 messageType;
|
||||
int32 sessionId;
|
||||
NetworkString<maxVersionStringSize> versionString;
|
||||
NetworkString<maxNameSize> name;
|
||||
|
@ -154,6 +158,7 @@ private:
|
|||
NetworkString<maxSmallStringSize> playerUUID;
|
||||
NetworkString<maxSmallStringSize> platform;
|
||||
};
|
||||
|
||||
void toEndian();
|
||||
void fromEndian();
|
||||
|
||||
|
@ -175,9 +180,12 @@ public:
|
|||
virtual void unpackMessage(unsigned char *buf);
|
||||
virtual unsigned char * packMessage();
|
||||
|
||||
|
||||
virtual size_t getDataSize() const { return sizeof(Data); }
|
||||
|
||||
virtual NetworkMessageType getNetworkMessageType() const {
|
||||
return nmtIntro;
|
||||
}
|
||||
|
||||
int32 getSessionId() const { return data.sessionId;}
|
||||
string getVersionString() const { return data.versionString.getString(); }
|
||||
string getName() const { return data.name.getString(); }
|
||||
|
@ -207,8 +215,8 @@ public:
|
|||
#pragma pack(push, 1)
|
||||
class NetworkMessagePing: public NetworkMessage{
|
||||
private:
|
||||
int8 messageType;
|
||||
struct Data{
|
||||
int8 messageType;
|
||||
int32 pingFrequency;
|
||||
int64 pingTime;
|
||||
};
|
||||
|
@ -231,6 +239,10 @@ public:
|
|||
|
||||
virtual size_t getDataSize() const { return sizeof(Data); }
|
||||
|
||||
virtual NetworkMessageType getNetworkMessageType() const {
|
||||
return nmtPing;
|
||||
}
|
||||
|
||||
int32 getPingFrequency() const {return data.pingFrequency;}
|
||||
int64 getPingTime() const {return data.pingTime;}
|
||||
int64 getPingReceivedLocalTime() const { return pingReceivedLocalTime; }
|
||||
|
@ -250,8 +262,8 @@ public:
|
|||
#pragma pack(push, 1)
|
||||
class NetworkMessageReady: public NetworkMessage{
|
||||
private:
|
||||
int8 messageType;
|
||||
struct Data{
|
||||
int8 messageType;
|
||||
uint32 checksum;
|
||||
};
|
||||
void toEndian();
|
||||
|
@ -272,6 +284,10 @@ public:
|
|||
|
||||
virtual size_t getDataSize() const { return sizeof(Data); }
|
||||
|
||||
virtual NetworkMessageType getNetworkMessageType() const {
|
||||
return nmtReady;
|
||||
}
|
||||
|
||||
uint32 getChecksum() const {return data.checksum;}
|
||||
|
||||
virtual bool receive(Socket* socket);
|
||||
|
@ -294,8 +310,9 @@ private:
|
|||
static const int maxFactionCRCCount= 20;
|
||||
|
||||
private:
|
||||
|
||||
int8 messageType;
|
||||
struct Data{
|
||||
int8 messageType;
|
||||
NetworkString<maxStringSize> description;
|
||||
NetworkString<maxSmallStringSize> map;
|
||||
NetworkString<maxSmallStringSize> tileset;
|
||||
|
@ -362,8 +379,12 @@ public:
|
|||
|
||||
virtual size_t getDataSize() const { return sizeof(Data); }
|
||||
|
||||
virtual NetworkMessageType getNetworkMessageType() const {
|
||||
return nmtLaunch;
|
||||
}
|
||||
|
||||
void buildGameSettings(GameSettings *gameSettings) const;
|
||||
int getMessageType() const { return data.messageType; }
|
||||
int getMessageType() const { return messageType; }
|
||||
|
||||
int getMapCRC() const { return data.mapCRC; }
|
||||
int getTilesetCRC() const { return data.tilesetCRC; }
|
||||
|
@ -371,6 +392,8 @@ public:
|
|||
vector<pair<string,uint32> > getFactionCRCList() const;
|
||||
|
||||
virtual bool receive(Socket* socket);
|
||||
virtual bool receive(Socket* socket, NetworkMessageType type);
|
||||
|
||||
virtual void send(Socket* socket);
|
||||
};
|
||||
#pragma pack(pop)
|
||||
|
@ -385,8 +408,9 @@ public:
|
|||
class NetworkMessageCommandList: public NetworkMessage {
|
||||
|
||||
private:
|
||||
|
||||
struct DataHeader {
|
||||
int8 messageType;
|
||||
|
||||
uint16 commandCount;
|
||||
int32 frameCount;
|
||||
uint32 networkPlayerFactionCRC[GameConstants::maxPlayers];
|
||||
|
@ -395,11 +419,12 @@ private:
|
|||
static const int32 commandListHeaderSize = sizeof(DataHeader);
|
||||
|
||||
struct Data {
|
||||
int8 messageType;
|
||||
DataHeader header;
|
||||
std::vector<NetworkCommand> commands;
|
||||
};
|
||||
void init(Data &data_ref) {
|
||||
data_ref.header.messageType = 0;
|
||||
data_ref.messageType = 0;
|
||||
data_ref.header.commandCount = 0;
|
||||
data_ref.header.frameCount = 0;
|
||||
for(int index = 0; index < GameConstants::maxPlayers; ++index) {
|
||||
|
@ -435,6 +460,10 @@ public:
|
|||
|
||||
virtual size_t getDataSize() const { return sizeof(Data); }
|
||||
|
||||
virtual NetworkMessageType getNetworkMessageType() const {
|
||||
return nmtCommandList;
|
||||
}
|
||||
|
||||
bool addCommand(const NetworkCommand* networkCommand);
|
||||
|
||||
void clear() {data.header.commandCount= 0;}
|
||||
|
@ -462,8 +491,9 @@ private:
|
|||
static const int maxTextStringSize= 500;
|
||||
|
||||
private:
|
||||
int8 messageType;
|
||||
struct Data{
|
||||
int8 messageType;
|
||||
|
||||
NetworkString<maxTextStringSize> text;
|
||||
int8 teamIndex;
|
||||
int8 playerIndex;
|
||||
|
@ -488,6 +518,10 @@ public:
|
|||
|
||||
virtual size_t getDataSize() const { return sizeof(Data); }
|
||||
|
||||
virtual NetworkMessageType getNetworkMessageType() const {
|
||||
return nmtText;
|
||||
}
|
||||
|
||||
string getText() const {return data.text.getString();}
|
||||
int getTeamIndex() const {return data.teamIndex;}
|
||||
int getPlayerIndex() const {return data.playerIndex;}
|
||||
|
@ -508,14 +542,16 @@ public:
|
|||
#pragma pack(push, 1)
|
||||
class NetworkMessageQuit: public NetworkMessage{
|
||||
private:
|
||||
struct Data{
|
||||
int8 messageType;
|
||||
};
|
||||
|
||||
int8 messageType;
|
||||
//struct Data{
|
||||
// int8 messageType;
|
||||
//};
|
||||
void toEndian();
|
||||
void fromEndian();
|
||||
|
||||
private:
|
||||
Data data;
|
||||
//Data data;
|
||||
|
||||
protected:
|
||||
virtual const char * getPackedMessageFormat() const;
|
||||
|
@ -526,7 +562,12 @@ protected:
|
|||
public:
|
||||
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 void send(Socket* socket);
|
||||
|
@ -551,8 +592,6 @@ static const int maxFileCRCPacketCount= 25;
|
|||
private:
|
||||
|
||||
struct DataHeader {
|
||||
int8 messageType;
|
||||
|
||||
NetworkString<maxStringSize> map;
|
||||
NetworkString<maxStringSize> tileset;
|
||||
NetworkString<maxStringSize> tech;
|
||||
|
@ -575,6 +614,7 @@ private:
|
|||
static const int32 DetailSize2 = sizeof(uint32);
|
||||
|
||||
struct Data {
|
||||
int8 messageType;
|
||||
DataHeader header;
|
||||
DataDetail detail;
|
||||
};
|
||||
|
@ -607,6 +647,10 @@ public:
|
|||
|
||||
virtual size_t getDataSize() const { return sizeof(Data); }
|
||||
|
||||
virtual NetworkMessageType getNetworkMessageType() const {
|
||||
return nmtSynchNetworkGameData;
|
||||
}
|
||||
|
||||
virtual bool receive(Socket* socket);
|
||||
virtual void send(Socket* socket);
|
||||
|
||||
|
@ -644,8 +688,6 @@ static const uint32 maxFileCRCPacketCount= 25;
|
|||
private:
|
||||
|
||||
struct DataHeader {
|
||||
int8 messageType;
|
||||
|
||||
uint32 mapCRC;
|
||||
uint32 tilesetCRC;
|
||||
uint32 techCRC;
|
||||
|
@ -663,6 +705,7 @@ private:
|
|||
static const int32 DetailSize2 = sizeof(uint32);
|
||||
|
||||
struct Data {
|
||||
int8 messageType;
|
||||
DataHeader header;
|
||||
DataDetail detail;
|
||||
};
|
||||
|
@ -686,6 +729,10 @@ public:
|
|||
|
||||
virtual size_t getDataSize() const { return sizeof(Data); }
|
||||
|
||||
virtual NetworkMessageType getNetworkMessageType() const {
|
||||
return nmtSynchNetworkGameDataStatus;
|
||||
}
|
||||
|
||||
virtual bool receive(Socket* socket);
|
||||
virtual void send(Socket* socket);
|
||||
|
||||
|
@ -716,8 +763,9 @@ private:
|
|||
static const int maxStringSize= 256;
|
||||
|
||||
private:
|
||||
int8 messageType;
|
||||
struct Data{
|
||||
int8 messageType;
|
||||
|
||||
|
||||
uint32 totalFileCount;
|
||||
uint32 fileIndex;
|
||||
|
@ -742,6 +790,10 @@ public:
|
|||
|
||||
virtual size_t getDataSize() const { return sizeof(Data); }
|
||||
|
||||
virtual NetworkMessageType getNetworkMessageType() const {
|
||||
return nmtSynchNetworkGameDataFileCRCCheck;
|
||||
}
|
||||
|
||||
virtual bool receive(Socket* socket);
|
||||
virtual void send(Socket* socket);
|
||||
|
||||
|
@ -766,8 +818,9 @@ private:
|
|||
static const int maxStringSize= 256;
|
||||
|
||||
private:
|
||||
|
||||
int8 messageType;
|
||||
struct Data{
|
||||
int8 messageType;
|
||||
|
||||
NetworkString<maxStringSize> fileName;
|
||||
};
|
||||
|
@ -789,6 +842,10 @@ public:
|
|||
|
||||
virtual size_t getDataSize() const { return sizeof(Data); }
|
||||
|
||||
virtual NetworkMessageType getNetworkMessageType() const {
|
||||
return nmtSynchNetworkGameDataFileGet;
|
||||
}
|
||||
|
||||
virtual bool receive(Socket* socket);
|
||||
virtual void send(Socket* socket);
|
||||
|
||||
|
@ -821,8 +878,10 @@ private:
|
|||
static const int maxPlayernameStringSize= 80;
|
||||
|
||||
private:
|
||||
|
||||
int8 messageType;
|
||||
struct Data {
|
||||
int8 messageType;
|
||||
|
||||
NetworkString<maxStringSize> selectedFactionName; //wanted faction name
|
||||
int8 currentSlotIndex;
|
||||
int8 toSlotIndex;
|
||||
|
@ -853,6 +912,10 @@ public:
|
|||
|
||||
virtual size_t getDataSize() const { return sizeof(Data); }
|
||||
|
||||
virtual NetworkMessageType getNetworkMessageType() const {
|
||||
return nmtSwitchSetupRequest;
|
||||
}
|
||||
|
||||
string getSelectedFactionName() const {return data.selectedFactionName.getString();}
|
||||
int getCurrentSlotIndex() const {return data.currentSlotIndex;}
|
||||
int getToSlotIndex() const {return data.toSlotIndex;}
|
||||
|
@ -881,8 +944,10 @@ public:
|
|||
class PlayerIndexMessage: public NetworkMessage{
|
||||
|
||||
private:
|
||||
|
||||
int8 messageType;
|
||||
struct Data {
|
||||
int8 messageType;
|
||||
|
||||
int16 playerIndex;
|
||||
};
|
||||
void toEndian();
|
||||
|
@ -902,6 +967,10 @@ public:
|
|||
|
||||
virtual size_t getDataSize() const { return sizeof(Data); }
|
||||
|
||||
virtual NetworkMessageType getNetworkMessageType() const {
|
||||
return nmtPlayerIndexMessage;
|
||||
}
|
||||
|
||||
int16 getPlayerIndex() const {return data.playerIndex;}
|
||||
|
||||
virtual bool receive(Socket* socket);
|
||||
|
@ -940,8 +1009,10 @@ enum NetworkMessageLoadingStatusType {
|
|||
#pragma pack(push, 1)
|
||||
class NetworkMessageLoadingStatus : public NetworkMessage {
|
||||
private:
|
||||
|
||||
int8 messageType;
|
||||
struct Data {
|
||||
int8 messageType;
|
||||
|
||||
uint32 status;
|
||||
};
|
||||
void toEndian();
|
||||
|
@ -962,6 +1033,10 @@ public:
|
|||
|
||||
virtual size_t getDataSize() const { return sizeof(Data); }
|
||||
|
||||
virtual NetworkMessageType getNetworkMessageType() const {
|
||||
return nmtLoadingStatusMessage;
|
||||
}
|
||||
|
||||
uint32 getStatus() const {return data.status;}
|
||||
|
||||
virtual bool receive(Socket* socket);
|
||||
|
@ -982,8 +1057,10 @@ private:
|
|||
static const int maxTextStringSize= 500;
|
||||
|
||||
private:
|
||||
|
||||
int8 messageType;
|
||||
struct Data{
|
||||
int8 messageType;
|
||||
|
||||
|
||||
int16 targetX;
|
||||
int16 targetY;
|
||||
|
@ -1009,6 +1086,10 @@ public:
|
|||
|
||||
virtual size_t getDataSize() const { return sizeof(Data); }
|
||||
|
||||
virtual NetworkMessageType getNetworkMessageType() const {
|
||||
return nmtMarkCell;
|
||||
}
|
||||
|
||||
string getText() const { return data.text.getString(); }
|
||||
Vec2i getTarget() const { return Vec2i(data.targetX,data.targetY); }
|
||||
int getFactionIndex() const { return data.factionIndex; }
|
||||
|
@ -1030,8 +1111,10 @@ public:
|
|||
class NetworkMessageUnMarkCell: public NetworkMessage {
|
||||
|
||||
private:
|
||||
|
||||
int8 messageType;
|
||||
struct Data {
|
||||
int8 messageType;
|
||||
|
||||
|
||||
int16 targetX;
|
||||
int16 targetY;
|
||||
|
@ -1055,6 +1138,10 @@ public:
|
|||
|
||||
virtual size_t getDataSize() const { return sizeof(Data); }
|
||||
|
||||
virtual NetworkMessageType getNetworkMessageType() const {
|
||||
return nmtUnMarkCell;
|
||||
}
|
||||
|
||||
Vec2i getTarget() const { return Vec2i(data.targetX,data.targetY); }
|
||||
int getFactionIndex() const { return data.factionIndex; }
|
||||
|
||||
|
@ -1077,8 +1164,9 @@ private:
|
|||
static const int maxTextStringSize= 500;
|
||||
|
||||
private:
|
||||
|
||||
int8 messageType;
|
||||
struct Data{
|
||||
int8 messageType;
|
||||
|
||||
int16 targetX;
|
||||
int16 targetY;
|
||||
|
@ -1102,6 +1190,10 @@ public:
|
|||
|
||||
virtual size_t getDataSize() const { return sizeof(Data); }
|
||||
|
||||
virtual NetworkMessageType getNetworkMessageType() const {
|
||||
return nmtHighlightCell;
|
||||
}
|
||||
|
||||
Vec2i getTarget() const { return Vec2i(data.targetX,data.targetY); }
|
||||
int getFactionIndex() const { return data.factionIndex; }
|
||||
|
||||
|
|
|
@ -1406,18 +1406,22 @@ int Socket::receive(void *data, int dataSize, bool tryReceiveUntilDataSizeMet) {
|
|||
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__);
|
||||
|
||||
Chrono chronoElapsed(true);
|
||||
const int MAX_RECV_WAIT_SECONDS = 3;
|
||||
time_t tStartTimer = time(NULL);
|
||||
while((bytesReceived < 0 && lastSocketError == PLATFORM_SOCKET_TRY_AGAIN) &&
|
||||
(difftime((long int)time(NULL),tStartTimer) <= MAX_RECV_WAIT_SECONDS)) {
|
||||
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();
|
||||
|
||||
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;
|
||||
}
|
||||
else if(Socket::isReadable(true) == true) {
|
||||
//else if(Socket::isReadable(true) == true) {
|
||||
else {
|
||||
// MutexSafeWrapper safeMutexSocketDestructorFlag(&inSocketDestructorSynchAccessor,CODE_AT_LINE);
|
||||
// if(this->inSocketDestructor == true) {
|
||||
// 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);
|
||||
// safeMutexSocketDestructorFlag.ReleaseLock();
|
||||
|
||||
MutexSafeWrapper safeMutex(dataSynchAccessorRead,CODE_AT_LINE);
|
||||
bytesReceived = recv(sock, reinterpret_cast<char*>(data), dataSize, 0);
|
||||
lastSocketError = getLastSocketError();
|
||||
safeMutex.ReleaseLock();
|
||||
//if(chronoElapsed.getMillis() % 2 == 0) {
|
||||
// sleep(0);
|
||||
//}
|
||||
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(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] bytesReceived = %d\n",__FILE__,__FUNCTION__,__LINE__,bytesReceived);
|
||||
|
||||
int iErr = getLastSocketError();
|
||||
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(isSocketValid() == true) {
|
||||
// Chrono recvTimer(true);
|
||||
//SafeSocketBlockToggleWrapper safeUnblock(this, false);
|
||||
SafeSocketBlockToggleWrapper safeUnblock(this, false);
|
||||
errno = 0;
|
||||
err = recv(sock, reinterpret_cast<char*>(data), dataSize, MSG_PEEK);
|
||||
lastSocketError = getLastSocketError();
|
||||
if(pLastSocketError != NULL) {
|
||||
*pLastSocketError = lastSocketError;
|
||||
}
|
||||
//safeUnblock.Restore();
|
||||
safeUnblock.Restore();
|
||||
|
||||
// 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());
|
||||
|
@ -1588,14 +1612,14 @@ int Socket::peek(void *data, int dataSize,bool mustGetData,int *pLastSocketError
|
|||
MutexSafeWrapper safeMutex(dataSynchAccessorRead,CODE_AT_LINE);
|
||||
|
||||
// Chrono recvTimer(true);
|
||||
//SafeSocketBlockToggleWrapper safeUnblock(this, false);
|
||||
SafeSocketBlockToggleWrapper safeUnblock(this, false);
|
||||
errno = 0;
|
||||
err = recv(sock, reinterpret_cast<char*>(data), dataSize, MSG_PEEK);
|
||||
lastSocketError = getLastSocketError();
|
||||
if(pLastSocketError != NULL) {
|
||||
*pLastSocketError = lastSocketError;
|
||||
}
|
||||
//safeUnblock.Restore();
|
||||
safeUnblock.Restore();
|
||||
|
||||
// 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());
|
||||
|
|
Loading…
Reference in New Issue