⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sockets.cpp

📁 wyd server 753 development with c++ and codeblocks
💻 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 + -