Klasse Einbinden macht probleme



  • Hallo ich habe eine Klasse Socket, wenn ich diese nun in die
    stdafx.h einbinde:

    #pragma once
    #include "Socket.h"
    
    using namespace std;
    

    kommt es zu jede menge Fehlern:

    1>Socket.obj : error LNK2028: Nicht aufgelöstes Token (0A00000A) ""extern "C" int __stdcall closesocket(unsigned int)" (?closesocket@@$$J14YGHI@Z)", auf das in Funktion ""public: void __clrcall Socket::close(void)" (?close@Socket@@$$FQAMXXZ)" verwiesen wird.
    1>Socket.obj : error LNK2028: Nicht aufgelöstes Token (0A00000C) ""extern "C" int __stdcall recv(unsigned int,char *,int,int)" (?recv@@$$J216YGHIPADHH@Z)", auf das in Funktion ""public: int __clrcall Socket::read(void)" (?read@Socket@@$$FQAMHXZ)" verwiesen wird.
    1>Socket.obj : error LNK2028: Nicht aufgelöstes Token (0A00000D) ""extern "C" int __stdcall send(unsigned int,char const *,int,int)" (?send@@$$J216YGHIPBDHH@Z)", auf das in Funktion ""public: void __clrcall Socket::write(int)" (?write@Socket@@$$FQAMXH@Z)" verwiesen wird.
    1>Socket.obj : error LNK2028: Nicht aufgelöstes Token (0A00000E) ""extern "C" int __stdcall __WSAFDIsSet(unsigned int,struct fd_set *)" (?__WSAFDIsSet@@$$J18YGHIPAUfd_set@@@Z)", auf das in Funktion ""public: int __clrcall Socket::dataAvailable(void)" (?dataAvailable@Socket@@$$FQAMHXZ)" verwiesen wird.
    1>Socket.obj : error LNK2028: Nicht aufgelöstes Token (0A00000F) ""extern "C" int __stdcall select(int,struct fd_set *,struct fd_set *,struct fd_set *,struct timeval const *)" (?select@@$$J220YGHHPAUfd_set@@00PBUtimeval@@@Z)", auf das in Funktion ""public: int __clrcall Socket::dataAvailable(void)" (?dataAvailable@Socket@@$$FQAMHXZ)" verwiesen wird.
    1>Socket.obj : error LNK2028: Nicht aufgelöstes Token (0A000010) ""extern "C" int __stdcall connect(unsigned int,struct sockaddr const *,int)" (?connect@@$$J212YGHIPBUsockaddr@@H@Z)", auf das in Funktion ""public: bool __clrcall Socket::connect(void)" (?connect@Socket@@$$FQAM_NXZ)" verwiesen wird.
    1>Socket.obj : error LNK2028: Nicht aufgelöstes Token (0A000011) ""extern "C" unsigned long __stdcall inet_addr(char const *)" (?inet_addr@@$$J14YGKPBD@Z)", auf das in Funktion ""public: bool __clrcall Socket::connect(void)" (?connect@Socket@@$$FQAM_NXZ)" verwiesen wird.
    1>Socket.obj : error LNK2028: Nicht aufgelöstes Token (0A000012) ""extern "C" unsigned short __stdcall htons(unsigned short)" (?htons@@$$J14YGGG@Z)", auf das in Funktion ""public: bool __clrcall Socket::connect(void)" (?connect@Socket@@$$FQAM_NXZ)" verwiesen wird.
    1>Socket.obj : error LNK2028: Nicht aufgelöstes Token (0A000014) ""extern "C" unsigned int __stdcall socket(int,int,int)" (?socket@@$$J212YGIHHH@Z)", auf das in Funktion ""public: __clrcall Socket::Socket(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int)" (??0Socket@@$$FQAM@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@Z)" verwiesen wird.
    1>Socket.obj : error LNK2028: Nicht aufgelöstes Token (0A000015) ""extern "C" int __stdcall WSAStartup(unsigned short,struct WSAData *)" (?WSAStartup@@$$J18YGHGPAUWSAData@@@Z)", auf das in Funktion ""public: __clrcall Socket::Socket(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int)" (??0Socket@@$$FQAM@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@Z)" verwiesen wird.
    1>Socket.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" int __stdcall __WSAFDIsSet(unsigned int,struct fd_set *)" (?__WSAFDIsSet@@$$J18YGHIPAUfd_set@@@Z)" in Funktion ""public: int __clrcall Socket::dataAvailable(void)" (?dataAvailable@Socket@@$$FQAMHXZ)".
    1>Socket.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" int __stdcall select(int,struct fd_set *,struct fd_set *,struct fd_set *,struct timeval const *)" (?select@@$$J220YGHHPAUfd_set@@00PBUtimeval@@@Z)" in Funktion ""public: int __clrcall Socket::dataAvailable(void)" (?dataAvailable@Socket@@$$FQAMHXZ)".
    1>Socket.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" int __stdcall send(unsigned int,char const *,int,int)" (?send@@$$J216YGHIPBDHH@Z)" in Funktion ""public: void __clrcall Socket::write(int)" (?write@Socket@@$$FQAMXH@Z)".
    1>Socket.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" int __stdcall recv(unsigned int,char *,int,int)" (?recv@@$$J216YGHIPADHH@Z)" in Funktion ""public: int __clrcall Socket::read(void)" (?read@Socket@@$$FQAMHXZ)".
    1>Socket.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" int __stdcall closesocket(unsigned int)" (?closesocket@@$$J14YGHI@Z)" in Funktion ""public: void __clrcall Socket::close(void)" (?close@Socket@@$$FQAMXXZ)".
    1>Socket.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" int __stdcall connect(unsigned int,struct sockaddr const *,int)" (?connect@@$$J212YGHIPBUsockaddr@@H@Z)" in Funktion ""public: bool __clrcall Socket::connect(void)" (?connect@Socket@@$$FQAM_NXZ)".
    1>Socket.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" unsigned long __stdcall inet_addr(char const *)" (?inet_addr@@$$J14YGKPBD@Z)" in Funktion ""public: bool __clrcall Socket::connect(void)" (?connect@Socket@@$$FQAM_NXZ)".
    1>Socket.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" unsigned short __stdcall htons(unsigned short)" (?htons@@$$J14YGGG@Z)" in Funktion ""public: bool __clrcall Socket::connect(void)" (?connect@Socket@@$$FQAM_NXZ)".
    1>Socket.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" unsigned int __stdcall socket(int,int,int)" (?socket@@$$J212YGIHHH@Z)" in Funktion ""public: __clrcall Socket::Socket(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int)" (??0Socket@@$$FQAM@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@Z)".
    1>Socket.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" int __stdcall WSAStartup(unsigned short,struct WSAData *)" (?WSAStartup@@$$J18YGHGPAUWSAData@@@Z)" in Funktion ""public: __clrcall Socket::Socket(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int)" (??0Socket@@$$FQAM@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@Z)".
    1>C:\Users\Jan\documents\visual studio 2010\Projects\Chat\Debug\Chat.exe : fatal error LNK1120: 20 nicht aufgelöste externe Verweise.
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
    

    hier einmal die Klasse

    #ifndef SocketH
    #define SocketH
    
    #include <string>
    #include <winsock2.h>
    #include "stdafx.h"
    
    using namespace std;
    
    class Socket
    {
    private:
      string  host;
      int     port;
      SOCKET  socket;
    public:
      Socket(string host, int port);
      Socket(SOCKET socket);  // wird zur Socketerzeugung beim ServerSocket benoetigt
      bool connect();
      int  dataAvailable();
      void write(int b);
      void write(const char* b, int len);
      void write(string s);
      int  read();
      int  read(char* b, int len);
      string readLine();
      void close();
    };
    #endif
    

    und die cpp

    #include "Socket.h"
    #include "stdafx.h"
    //---------------------------------------------------------------------------
    
    Socket::Socket(string host, int port)
    {
      this->port = port;
      this->host = host;
      // WinSock-DLL einbinden
      WSADATA m_wsa;
      WSAStartup(MAKEWORD(2,0), &m_wsa);
      // Socket erzeugen
      this->socket = ::socket(AF_INET, SOCK_STREAM, 0);
    }
    
    Socket::Socket(SOCKET socket)
    {
       this->socket = socket;
    }
    
    bool Socket::connect()
    {
      SOCKADDR_IN addr;
      memset( &addr, 0, sizeof( SOCKADDR_IN ));
    
      addr.sin_family = AF_INET;
      addr.sin_port = htons((short)this->port);
      addr.sin_addr.s_addr = inet_addr(this->host.c_str());
    
      // Verbindung herstellen
      int rc = ::connect(socket, (SOCKADDR*) &addr, sizeof( SOCKADDR ));
    
      return rc != SOCKET_ERROR;
    }
    
    int Socket::dataAvailable()
    {
      fd_set set;
      FD_ZERO(&set);
      FD_SET(this->socket, &set);
      timeval timeout;
      timeout.tv_sec = 0;
      timeout.tv_usec = 25;
      if (select(this->socket + 1, &set, 0, 0, &timeout) == -1)
        return 0; // error
      return FD_ISSET(this->socket, &set);
    } 
    
    void Socket::write(int b)
    {
      char tmp[1];
      tmp[0] = (char)b;
      send(socket, tmp, 1, 0);
    }
    
    void Socket::write(const char*b, int len)
    {
      send(socket, b, len, 0);
    }
    
    void Socket::write(string s)
    {
      send(socket, s.c_str(), (int)s.length(), 0);
    }
    
    int Socket::read()
    {
      char tmp[1];
      recv(socket, tmp, 1, 0);
      return tmp[0];
    }
    
    int Socket::read(char* b, int len)
    {
      return recv(socket, b, len, 0);
    }
    
    string Socket::readLine()
    {
      char buffIn[256];
      int pos = -1;
      do {
        pos++;
        recv(socket, buffIn+pos, 1, 0);
      } while (buffIn[pos] != '\n');
      buffIn[pos] = '\0';  // echo-String ist mit '\n' abgechlossen
      return string(buffIn);
    }
    
    void Socket::close()
    {
      closesocket(socket);
    }
    

    Hat jemand eine Lösung parat?



  • Warum hast du denn dafür ein C++/CLI Projekt verwendet, ist doch reines C++?

    Außerdem verwendest du die <stdafx.h> komplett falsch (bisher hast du einen Ring-Include drin: stdafx.h -> Socket.h -> stdafx.h -> ...)
    Dies muß in der CPP-Datei jeweils die erste include-Anweisung sein (aber niemals in Header-Dateien!).

    Und niemals "using namespace std;" auf globaler Ebene in Header-Dateien verwenden!!!



  • Th69 schrieb:

    Warum hast du denn dafür ein C++/CLI Projekt verwendet, ist doch reines C++?

    ➡ Er ist im falschen Forum. 🕶

    @usedes:
    Die Fehler die angezeigt werden sind Linker Fehler. Der Linker beschwert sich über nicht gefundene Symbole. Du musst noch die Library, welche die Symbole enthält, dazulinken. Das kann man auf verschiedene Arten tun, eine ist so:

    Füge im z.B. in Socket.cpp folgende Zeile ein (nach den Includes):

    #pragma comment (lib, "ws2.32.lib")
    

Anmelden zum Antworten