неразрешенный внешний символ "cSocket :: cSocket (void)" в функции _main - PullRequest
0 голосов
/ 15 февраля 2011
#ifndef _ClientSocket_H_
#define _ClientSocket_H_

#include "Includes.h"
#include "LOGMSGs.h"

class cSocket
{
public:
    cSocket();
    bool Open();
    bool Listen(char *OnIP,int OnPort);
    void Send(char *MSG, int len);
    void Recv(char *MSG,int len);
    void Close();
protected:
    SOCKET  cSock;
    const int   SndBuf;
};

#endif


#include "ClientSocket.h"


bool cSocket::Open()
{
    WSADATA wsaData;
    int err;
    if((err =WSAStartup(0x202, &wsaData)) !=0)
    {
        Error("Init WSAStartup() failed[%d].", err);
        return false;
    }
    return true;
}

bool cSocket::Listen(char *OnIP,int OnPort)
{
    if(Open())
    {
        //Create the main socket
        cSock=socket(AF_INET, SOCK_STREAM, 0);
        if(cSock==INVALID_SOCKET)
        {
            int err = WSAGetLastError();
            //WSACleanup();
            printf("Init socket() failed[%d].", err);
            return FALSE;
        }

        //Set the REUSEADDR SOCKET
        int     optval = 1;
        if(setsockopt(cSock, SOL_SOCKET, SO_REUSEADDR, (char *) &optval, sizeof(optval)))
        {
            int err = WSAGetLastError();
            Close();
            printf("Init setsockopt() SO_REUSEADDR failed[%d].", err);
            return FALSE;
        }

        //Set the KEEPALIVE SOCKET
        optval = 1;
        if(setsockopt(cSock, SOL_SOCKET, SO_KEEPALIVE, (char *) &optval, sizeof(optval)))
        {
            int err = WSAGetLastError();
            Close();
            printf("Init setsockopt() SO_KEEPALIVE failed[%d].", err);
            return FALSE;
        }

            // Set the SNDBUF SOCKET
        if(SndBuf)      // Non-0: pointer SNDBUG
        {
            optval = SndBuf;
            if(setsockopt(cSock, SOL_SOCKET, SO_SNDBUF, (char *) &optval, sizeof(optval)))
            {
                int err = WSAGetLastError();
                Close();
                printf("Init setsockopt() SO_SNDBUF failed[%d].", err);
                return FALSE;
            }

            // Read the SNDBUF SOCKET
            int ret = sizeof(optval);
            if(getsockopt(cSock, SOL_SOCKET, SO_SNDBUF, (char *) &optval, &ret) == 0)
            {
                LOGMSG("send buffer size SOCKET [%d] K.", optval/1024);
            }
        }

        SOCKADDR_IN     sin;
        memset(&sin, 0, sizeof(sin));
        sin.sin_family      = AF_INET;
        sin.sin_addr.s_addr = inet_addr(OnIP);
        sin.sin_port        = htons(OnPort);
        if(bind(cSock, (LPSOCKADDR) &sin, sizeof(sin)))
        {
            int err = WSAGetLastError();
            Close();
            printf("Init bind() failed[%d].", err);
            return FALSE;
        }

        //Set to non-blocking mode
        unsigned long   i = 1;
        if(ioctlsocket(cSock, FIONBIO, &i))
        {
            int err = WSAGetLastError();
            Close();
            printf("Init ioctlsocket() failed[%d].", err);
            return FALSE;
        }

        //Listening port
        if(listen(cSock, SOMAXCONN))        // SOMAXCONN: WIN macro definition
        {
            int err = WSAGetLastError();
            Close();
            printf("Init listen() failed[%d].", err);
            return FALSE;
        }
        return true;
    }
return false;
}


void cSocket::Close()
{
    closesocket(cSock);
    WSACleanup();
}


#include "Includes.h"
#include "LOGMSGs.h"
#include "auth_proto.h"
#include "Packets.h"
#include "ClientSocket.h"


int main(int argc, char* argv[]) 
{
    cSocket sock;
    while(1)
    {
        sock.Open();
        sock.Listen("127.0.0.1",4444);
    }
    return 0;
}

Ошибка: неразрешенный внешний символ "public: __thiscall cSocket :: cSocket (void)" (?? 0cSocket @@ QAE @ XZ), на который есть ссылка в функции _main

что не так?

Ответы [ 2 ]

5 голосов
/ 15 февраля 2011

Это ошибка компоновщика, это означает, что компилятор проверил, что код не содержит синтаксических ошибок, но компоновщик не может найти реализацию функции, которую вы пытались вызвать где-то в программе.В этом случае функция, которую она не может найти:

__thiscall cSocket::cSocket(void)" (??0cSocket@@QAE@XZ) 

Эта функция выглядит загадочно из-за именования , где компилятор берет имя функции в исходном коде изатем преобразует его таким образом, чтобы обеспечить более безопасное соединение типов.Тем не менее, вы все еще можете видеть, что в коде этого есть имя функции

cSocket::cSocket(void)

Это конструктор для cSocket.Если вы заметите, нигде в коде вы не определили этот конструктор, поэтому компоновщик не может найти реализацию для него.Изменение вашего кода путем добавления реализации должно помочь исправить это.

В более общем смысле, хотя, если вы когда-либо видите такую ​​ошибку, это обычно означает, что вы пообещали компилятору, что некоторая функция или объект существует черезпрототип функции или объявление extern, но он не передал объектный файл компоновщику, содержащему его определение.Обычно основными причинами этого являются (примерно в таком порядке);

  1. Вы создали прототип функции, но забыли ее реализовать. Думаю, именно это и произошло.
  2. Вы создали прототип функции, но затем реализовали ее с другой сигнатурой .Например, если вы создаете прототип функции void MyFunction(int), но затем реализуете функцию как void MyFunction(int&) или void MyFunction(), компоновщик будет считать это перегрузкой, а не реализацией, и выдаст ошибку во время соединения, а невремя компиляции.
  3. Вы скомпилировали код с определением, но не связали его. Это может произойти, если у вас есть многофайловый проект, а затем вы забыли передать один изфайлы в качестве входных данных для компоновщика.

Надеюсь, это поможет!

2 голосов
/ 15 февраля 2011

Вы не объявили определение конструктора

cSocket::cSocket()
{
    //your init code here
}

, если вы не намеревались иметь конструктор, просто удалите строку cSocket(); из объявления класса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...