WSAGetLastError() is returning 0
Hello. I'm making a server emulator for a game someone else made. In the code i check the return value of "recv" to see if the player has disconnected. When recv() returns -1 it could mean they disconnected OR it could just mean there is no data to receive on a non blocking socket. For some reason WSAGetLastError() returns 0 even after recv returns a -1. Heres the code:
Code:
int Player::RecvPackets()
{
int size = 1;
while(size > 0)
{
char buffer[0xFFFF];
size = socketId->Read(buffer, 2);
if(size == 2)
{
unsigned short dataLen = ((unsigned short)buffer[0] << 8) + (unsigned short)buffer[1];
//Receive all the data
unsigned short received = 0;
while((size = socketId->Read(&buffer[received], dataLen - received)) > 0 && received < dataLen)
received += size;
if(received == dataLen)
{
char uncompressedData[0xFFFF];
size_t cLen = sizeof(uncompressedData) - 1;
//decompress the received data
if(uncompress((Bytef*)uncompressedData,(uLongf*)&cLen,(const Bytef*)buffer, dataLen) == Z_OK)
{
uncompressedData[cLen] = 0;
vector<string> packetList = TokenizeString(uncompressedData, "\n");
for(unsigned int i = 0; i < packetList.size(); ++i)
{
ByteStream packet(packetList[i]);
if(firstPacket)
ParseLoginPacket(packet);
else ParsePacket(packet);
}
} else {
server << LogHeader() << "Decompression error\n";
Disconnect("Decompression error");
break;
}
} else {
server << LogHeader() << "Bytes received doesn't match the packet size\n";
Disconnect("Invalid packet length");
break;
}
} else if(size > 0) {
server << LogHeader() << "Couldn't receive packet size\n";
Disconnect("Network error");
break;
}
if(size == 0 || (size < 0 && soxLastError() != EWOULDBLOCK))
{
server << LogHeader() << "Player left with socket error " << soxLastError() << "\n";
Disconnect();
}
}
return 1;
}
The last few lines is where the player keeps getting disconnected. First it checks if size returned 0 which means disconnection. Then it checks if size returns a negative which means error. If it did return negative than it checks if the error isn't due to non blocking. If it's not because of non blocking than it needs to remove the player. The player always gets disconnected (it only prints out one "Packet received" before disconnecting) and soxLastError() (which is just WSAGetLastError()) always returns 0 instead of EWOULDBLOCK or some other error.
NOTE: Socket::Read() just calls recv().