)
Zerosquare (./498) :
Vous êtes de dangereux psychopathes
(non sérieux, faire ça avec des batteries au plomb, c'est super dangereux)
while (true)
{
FD_SET socketSet;
uint32 maxSock;
struct timeval timeoutDelay = { 1, 0 };
time_t currentTime = time(NULL);
FD_ZERO(&socketSet);
FD_SET(listenerSocket, &socketSet);
maxSock = (int)listenerSocket;
if (_client.isInUse)
{
FD_SET(_client.clientSocket, &socketSet);
if (_client.clientSocket > maxSock)
maxSock = _client.clientSocket;
FD_SET(_client.outputSocket, &socketSet);
if (_client.outputSocket > maxSock)
maxSock = _client.outputSocket;
}
if (select(maxSock + 1, &socketSet, NULL, NULL, &timeoutDelay) < 0)
continue;
// New connections ?
if (FD_ISSET(listenerSocket, &socketSet))
{
SOCKET csock = accept(listenerSocket, NULL, 0);
if (_client.isInUse) {
closesocket(csock);
}
else {
int errorCode = 0;
// Connect a socket to the outgoing host / port
SOCKET osock = socket(AF_INET, SOCK_STREAM, 0);
if (osock == -1) {
perror("Error while calling `socket`");
closesocket(csock);
}
else if (bind(csock, (SOCKADDR*)&localAddr, sizeof(localAddr)) < 0) {
perror("Error while calling `bind`");
closesocket(csock);
closesocket(osock);
}
else if (connect(osock, (SOCKADDR*)&outputAddr, sizeof(outputAddr)) < 0) {
perror("Error while calling `connect`");
closesocket(csock);
closesocket(osock);
}
else {
_client.outputSocket = osock;
_client.clientSocket = csock;
_client.lastActivity = currentTime;
_client.isInUse = true;
printf("[INFO] Client connected!\n");
}
}
bool closeNeeded = false;
uint32 byteCount = 0;
if (_client.isInUse) {
if (FD_ISSET(_client.clientSocket, &socketSet)) {
byteCount = recv(_client.clientSocket, dataBuffer, sizeof(dataBuffer), 0);
HandlePacket(std::string(dataBuffer), DIRECTION_CMSG);
if (byteCount <= 0 || send(_client.outputSocket, dataBuffer, byteCount, 0) <= 0)
closeNeeded = true;
else
_client.lastActivity = currentTime;
} else if (FD_ISSET(_client.outputSocket, &socketSet)) {
byteCount = recv(_client.outputSocket, dataBuffer, sizeof(dataBuffer), 0);
HandlePacket(std::string(dataBuffer), DIRECTION_SMSG);
if (byteCount <= 0 || send(_client.clientSocket, dataBuffer, byteCount, 0) <= 0)
closeNeeded = true;
else
_client.lastActivity = currentTime;
} else if (uint64(currentTime - _client.lastActivity) > _idleTimeout)
closeNeeded = true;
}
if (closeNeeded) {
closesocket(_client.clientSocket);
closesocket(_client.outputSocket);
_client.isInUse = false;
}
}
}

