📄 sockets.cpp
字号:
/* by My Destiny Team */#include "sockets.h"
#include "encdec.h"#include "packets.h"#include "server.h"
cSocket::cSocket()
{
FD_ZERO(&fdSocket);
timeout.tv_sec = 0;
timeout.tv_usec = 0;
srvSocket = INVALID_SOCKET;
socketCount = 0;
memset(LSocket, INVALID_SOCKET, sizeof(LSocket));
}
cSocket::~cSocket()
{
sSocket *ptrSocket = LSocket;
for(u32 var = 0; var < socketCount; ptrSocket++)
{
if(ptrSocket->Sock != INVALID_SOCKET)
{
closesocket(ptrSocket->Sock);
ptrSocket->Sock = INVALID_SOCKET;
var++;
}
}
socketCount = 0;
FD_ZERO(&fdSocket);
}
// Le o arquivo de configuracao do socket//// Retorna false se o arquivo nao foi encontrado// Retorna true se o arquivo foi lido com sucesso
bool cSocket::ReadConfig()
{ const char *def = "socket.ini";
FILE *fp = fopen(def, "r");
if(fp == NULL)
{ /* not found */
Log(WARN, Server.GetMessage(ERRORLOADED), def);
return false;
}
char cmd[16], val[16];
while(fgets(bufRecv, sizeof(bufRecv), fp))
{
if(bufRecv[0] == '#' || bufRecv[0] == '\n')
continue;
if(sscanf(bufRecv, "%s = %s", cmd, val) != 2) continue;
if(strcmp(cmd, "srvIP") == 0)
strcpy(srvIP, val);
else if(strcmp(cmd, "srvPort") == 0)
srvPort = atoi(val);
}
fclose(fp);
Log(NORMAL, Server.GetMessage(LOADEDFILE), def);
return true;
}
// Inicia a conexao do socket do server
//
// Retorna false se ocorreu um erro durante a cricao do socket
// Retorna true se o socket foi iniciado com sucesso
bool cSocket::StartServer()
{
srvSocket = socket(AF_INET, SOCK_STREAM, 0);
if(srvSocket == INVALID_SOCKET)
{ /* socket falhou */
Log(WARN, "socket() failed in cSocket::StartServer()");
}
else
{
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(srvIP);
addr.sin_port = htons(srvPort);
memset(addr.sin_zero, 0, sizeof(addr.sin_zero));
if(bind(srvSocket, (sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR)
{ /* bind falhou */
Log(WARN, "bind() failed in cSocket::StartServer()");
}
else
{
if(listen(srvSocket, 2) == SOCKET_ERROR)
{ /* listen falhou */
Log(WARN, "listen() failed in cSocket::StartServer()");
}
else
{ /* add socket in socketdata */
sSocket sSock;
sSock.clientID = 0;
sSock.lastPacket = 0;
sSock.Sock = srvSocket;
sSock.socketInfo = addr;
AddSocket(sSock, 0);
return true;
}
}
}
return false;
}
// Verifica se o socket esta inativo
void cSocket::CheckSockets()
{
sSocket *ptrSock = &LSocket[1];
for(u32 x = 1; x < socketCount; ptrSock++)
{
if(ptrSock->Sock != INVALID_SOCKET)
{
int timenow = time(NULL);
if(ptrSock->clientID == INVALID_SERVERINDEX)
{ /* client n adicionado na lista */
if((ptrSock->lastPacket + 5) < timenow)
{ /* timeout para o envio do login */
DeleteSocket(*ptrSock);
continue;
}
}
else if((ptrSock->lastPacket + 60) < timenow)
{ /* client ja esta na lista */
Log(INFO, Server.GetMessage(CLOSINGCLIENTTIME),
ptrSock->clientID);
DeleteSocket(*ptrSock);
continue;
}
x++;
}
}
}
// Adiciona o socket//// Retorna false se a lista esta cheia// Retorna true se o socket foi adicionado
bool cSocket::AddSocket(sSocket &sSock, s32 id)
{
if(id == -1)
{ /* procura uma id valida */
for(id = 1; id < FD_SETSIZE; id++)
if(LSocket[id].Sock == INVALID_SOCKET)
break;
if(id == FD_SETSIZE)
return false;
}
if(sSock.Sock >= maxfd)
maxfd = sSock.Sock + 1;
socketCount++;
LSocket[id] = sSock;
FD_SET(sSock.Sock, &fdSocket);
return true;
}
// Aceita novos clients no socket do servidor
//
// Retorna false se o socket do servidor
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -