- 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);
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__);

View File

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

View File

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

View File

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

View File

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