SOCKET Hilfe ....



  • Hallo,
    Ich lese grade "C++ von A bis Z" von Jürgen Wolf.
    Dieses Buch enthält eine CD mit allen im Buch besprochenen Scripts.
    So auch etwas zur Socket programmierung .
    Der Ordner entählt die folgenden Datein:

    echo_cilent.cpp
    echo_server.cpp
    socket.cpp
    socket.h

    Nun da das thema sehr kompliziert für mich war /ist....
    wollt ich einfach den beispielcode Debugen und schauen wie alles funktioniert ...

    hier ist der Code der einzelnen Datein :

    echo_cilent.cpp

    // echo_client.cpp
    #include "socket.h"
    #include <string>
    #include <iostream>
    #include <cstdlib>
    using namespace std;
    
    int main (int argc, char *argv[]) {
       if( argc < 2 ){
          cout << "Usage: " << *argv << " ServerAdresse\n";
          exit(1);
       }
       Socket sock;
       sock.create();
       // Adresse des Servers
       string argv_1 = argv[1];
       // Mit dem Server auf Port 15000 verbinden
       sock.connect( argv_1, 15000 );
       cout << "Nachricht an den Server: ";
       string s;
       getline(cin, s, '\n' );
       sock.send( s );
       sock.close();
       return 0;
    }
    

    echo_server.cpp

    // echo_server.cpp
    #include "socket.h"
    #include <string>
    #include <iostream>
    using namespace std;
    
    int main (void) {
       Socket sock1;
       sock1.create();
       // Wir verwenden Port 15000
       sock1.bind(15000);
       sock1.listen();
       while (true) {
          Socket sock2;
          sock1.accept( sock2 ); 
          string s;
          sock2.recv (s);
          cout << "Nachricht von Client erhalten: ";
          cout << s << endl;
          sock2.close();
       }
      sock1.close();
      return 0;
    }
    

    socket.cpp

    // socket.cpp
    #include <cstdlib>
    #include <winsock.h>
    #include <io.h>
    #include <iostream>
    #include "socket.h"
    using namespace std;
    
    // Konstruktor
    Socket::Socket() : m_sock(0) {
       // Winsock.DLL Initialisieren
       WORD wVersionRequested;
       WSADATA wsaData;
       wVersionRequested = MAKEWORD (1, 1);
       if (WSAStartup (wVersionRequested, &wsaData) != 0) {
          cout << "Fehler beim Initialisieren von Winsock" 
               << endl;
          exit(1);
       }
    }
    
    // Destruktor
    Socket::~Socket() {
       if ( is_valid() )
          ::closesocket ( m_sock );
    }
    
    // Erzeugt das Socket  - TCP
    bool Socket::create() {
       m_sock = ::socket(AF_INET,SOCK_STREAM,0);
       if (m_sock < 0) {
          cout << "Fehler beim Anlegen eines Socket" << endl;
          exit(1);
       }
       return true;
    }
    
    // Erzeugt das Socket  - UDP
    bool Socket::UDP_create() {
       m_sock = ::socket(AF_INET,SOCK_DGRAM,0);
       if (m_sock < 0) {
          cout << "Fehler beim Anlegen eines Socket" << endl;
          exit(1);
       }
    }
    
    // Erzeugt die Bindung an die Serveradresse
    // - genauer an einen bestimmten Port
    bool Socket::bind( const int port ) {
       if ( ! is_valid() ) {
          return false;
       }
       m_addr.sin_family = AF_INET;
       m_addr.sin_addr.s_addr = INADDR_ANY;
       m_addr.sin_port = htons ( port );
    
       int bind_return = ::bind ( m_sock,
          ( struct sockaddr * ) &m_addr, sizeof ( m_addr ) );
       if ( bind_return == -1 ) {
          return false;
       }
       return true;     
    }
    
    // Teile dem Socket mit, dass Verbindungswünsche
    // von Clients entgegengenommen werden
    bool Socket::listen() const {
       if ( ! is_valid() ) {
          return false;
       }
       int listen_return = ::listen ( m_sock, MAXCONNECTIONS );
       if ( listen_return == -1 ) {
          return false;
       }
      return true;
    }
    
    // Bearbeite die Verbindungswünsche von Clients
    // Der Aufruf von accept() blockiert solange,
    // bis ein Client Verbindung aufnimmt
    bool Socket::accept ( Socket& new_socket ) const {
       int addr_length = sizeof ( m_addr );
       new_socket.m_sock = ::accept( m_sock,
          ( sockaddr * ) &m_addr, ( int * ) &addr_length );
       if ( new_socket.m_sock <= 0 )
          return false;
       else
          return true;
    }
    
    // Baut die Verbindung zum Server auf
    bool Socket::connect( const string host, const int port ) {
       if ( ! is_valid() )
          return false;      
       struct hostent *host_info;
       unsigned long addr;
       memset( &m_addr, 0, sizeof (m_addr));
       if ((addr = inet_addr( host.c_str() )) != INADDR_NONE) {
           /* argv[1] ist eine numerische IP-Adresse */
           memcpy( (char *)&m_addr.sin_addr,
                   &addr, sizeof(addr));
       }
       else {
           /* Für den Fall der Fälle: Wandle den Servernamen  *
            * bspw. "localhost" in eine IP-Adresse um         */
           host_info = gethostbyname( host.c_str() );
           if (NULL == host_info) {
              cout << "Unbekannter Server" << endl;
              exit(1);
           }
           memcpy( (char *)&m_addr.sin_addr, host_info->h_addr,
                    host_info->h_length);
       }
       m_addr.sin_family = AF_INET;
       m_addr.sin_port = htons( port );      
    
       int status = ::connect ( m_sock,
          ( sockaddr * ) &m_addr, sizeof ( m_addr ) );
    
      if ( status == 0 )
        return true;
      else
        return false;
    }
    
    // Daten versenden via TCP
    bool Socket::send( const string s ) const {
       int status = ::send ( m_sock, s.c_str(), s.size(),  0 );
       if ( status == -1 ) {
          return false;
       }
       else {
          return true;
       }
    }
    
    // Daten empfangen via TCP
    int Socket::recv ( string& s ) const {
      char buf [ MAXRECV + 1 ];
      s = "";
      memset ( buf, 0, MAXRECV + 1 );
    
      int status = ::recv ( m_sock, buf, MAXRECV, 0 );
      if ( status > 0 || status != SOCKET_ERROR ) {
         s = buf;
         return status;
      }
      else {
         cout << "Fehler in Socket::recv" << endl;
         exit(1);
         return 0;
      } 
    }
    
    // Daten versenden via UDP
    bool Socket::UDP_send( const string addr, const string s, const int port ) const {
       struct sockaddr_in addr_sento;
       struct hostent *h;
       int rc;
    
       h = gethostbyname(addr.c_str());
       if (h == NULL) {
          cout << "Unbekannter Host?" << endl;
          exit(1);
       }
       addr_sento.sin_family = h->h_addrtype;
       memcpy ( (char *) &addr_sento.sin_addr.s_addr,
                h->h_addr_list[0], h->h_length);
       addr_sento.sin_port = htons (port);
       rc = sendto( m_sock, s.c_str(), s.size(), 0,
                     (struct sockaddr *) &addr_sento,
                      sizeof (addr_sento));
       if (rc == SOCKET_ERROR) {
          cout << "Konnte Daten nicht senden - sendto()" 
               << endl;
          exit(1);
       }        
       return true;
    }
    
    // Daten empfangen vie UDP
    int Socket::UDP_recv( string& s ) const {
       struct sockaddr_in addr_recvfrom;
       int len, n;
       char buf [ MAXRECV + 1 ];
       s = "";
       memset ( buf, 0, MAXRECV + 1 );
       len = sizeof (addr_recvfrom);
       n = recvfrom ( m_sock, buf, MAXRECV, 0,
                      (struct sockaddr *) &addr_recvfrom, &len );
       if (n == SOCKET_ERROR){
          cout << "Fehler bei recvfrom()" << endl;
          exit(1);
          return 0;
       }
       else {
          s = buf;
          return n;
       } 
    }
    
    // Winsock.dll freigeben
    void Socket::cleanup() const {
       /* Cleanup Winsock */
       WSACleanup();
    }
    
    // Socket schließen und Winsock.dll freigeben
    bool Socket::close() const {
       closesocket(m_sock);
       cleanup();
       return true;
    }
    

    socket.h

    /* socket.h für MS-Windows */
    #ifndef SOCKET_H_
    #define SOCKET_H_
    #include <string>
    #include <winsock.h>
    #include <io.h>
    using namespace std;
    
    // Max. Anzahl Verbindungen
    const int MAXCONNECTIONS = 5;
    // Max. Anzahl an Daten die aufeinmal empfangen werden
    const int MAXRECV = 1024;
    
    // Die Klasse Socket
    class Socket {
       private:
       // Socketnummer (Socket-Deskriptor)           
       int m_sock; 
       // Struktur sockaddr_in
       sockaddr_in m_addr;
    
       public:
       // Konstruktor
       Socket();
       // virtueller Destruktor
       virtual ~Socket();
    
       // Socket erstellen - TCP
       bool create();
       // Socket erstellen - UDP
       bool UDP_create();
       bool bind( const int port );
       bool listen() const;
       bool accept( Socket& ) const;
       bool connect ( const string host, const int port );
       // Datenübertragung - TCP
       bool send ( const string ) const;
       int recv ( string& ) const;
       // Datenübertragung - UDP
       bool UDP_send( const string, const string,
                      const int port ) const;
       int UDP_recv( string& ) const;
       // Socket schließen
       bool close() const;
       // WSAcleanup()
       void cleanup() const;
       bool is_valid() const { return m_sock != -1; }
    };
    #endif
    

    Nun debuge ich also echo_cilent und es kommen folgende Fehlermeldungen:
    [Linker error] undefined referce to 'Socket::Socket()'
    [Linker error] undefined referce to 'Socket::create()'
    [Linker error] undefined referce to 'Socket::connect(std::string,int)'
    [Linker error] undefined referce to 'Socket::close() const'
    [Linker error] undefined referce to 'Socket::~Socket()'
    ld returned 1 exit status

    und wenn ich echo_server debuge kommen folgende meldungen:
    [Linker error] undefined referce to 'Socket::Socket()'
    [Linker error] undefined referce to 'Socket::create()'
    [Linker error] undefined referce to 'Socket::bind(int)'
    [Linker error] undefined referce to 'Socket::listen() const'
    [Linker error] undefined referce to 'Socket::Socket()'
    [Linker error] undefined referce to 'Socket::accept(Socket&) const'
    [Linker error] undefined referce to 'Socket::recv(std::string)const'
    [Linker error] undefined referce to 'Socket::~Socket()'
    [Linker error] undefined referce to 'Socket::~Socket()'
    [Linker error] undefined referce to 'Socket::~Socket()'
    ld returned 1 exit status

    diese meldungen beziehen sich auf Dev C++ aber mit anderen programmen habe ich es auch probiert (Microsoft visual studio c++ ; Code::Bolcks)

    Ich weiß echt nicht weiter ,weil ich kann es ja nicht leren wenn ich falsches ausgangsmaterial habe ...

    Danke für eure antworten...
    MfG
    Max


  • Mod

    MaxM93 schrieb:

    Hallo,
    Ich lese grade "C++ von A bis Z" von Jürgen Wolf.

    Dies ist dein erster, großer Fehler.

    diese meldungen beziehen sich auf Dev C++

    Dies ist dein zweiter Fehler.

    Die gezeigten Fehler bedeuten, dass du gar nicht debuggst, sondern das Programm noch nicht einmal gelinkt bekommst. Du hast nämlich vergessen, jeweils gegen die aus der socket.cpp erzeugte Objektdatei zu linken. Wie das im Detail geht, kann ich dir nicht erklären, weil ich mich mit Dev-C++ nicht auskenne. Vielleicht helfen dir diese Stichworte aber schon um das selbst herauszufinden. Bestimmt meldet sich auch gleich jemand, der dir dies für die moderneren IDEs erklärt.



  • Ohh man,
    soviele Fehler auf einmal .... >_<
    Gannz großes Dankeschön für die schnelle Antwort.

    Jetzt bracht man ja schon ein Buch für die Bedinnung von Entwicklungsumgebungen ...

    😞



  • Bei visual studio 2010 express kommt folgende fehlermeldung:

    1>------ Erstellen gestartet: Projekt: hello, Konfiguration: Debug Win32 ------
    1>socket.obj : error LNK2028: Nicht aufgelöstes Token (0A000343) ""extern "C" int __stdcall connect(unsigned int,struct sockaddr const *,int)" (?connect@@$$J212YGHIPBUsockaddr@@H@Z)", auf das in Funktion ""public: bool __thiscall Socket::connect(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int)" (?connect@Socket@@$$FQAE_NV?$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 (0A00034E) ""extern "C" int __stdcall WSAStartup(unsigned short,struct WSAData *)" (?WSAStartup@@$$J18YGHGPAUWSAData@@@Z)", auf das in Funktion ""public: __thiscall Socket::Socket(void)" (??0Socket@@$$FQAE@XZ)" verwiesen wird.
    1>socket.obj : error LNK2028: Nicht aufgelöstes Token (0A000350) ""extern "C" int __stdcall recvfrom(unsigned int,char *,int,int,struct sockaddr *,int *)" (?recvfrom@@$$J224YGHIPADHHPAUsockaddr@@PAH@Z)", auf das in Funktion ""public: int __thiscall Socket::UDP_recv(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > &)const " (?UDP_recv@Socket@@$$FQBEHAAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)" verwiesen wird.
    1>socket.obj : error LNK2028: Nicht aufgelöstes Token (0A000355) ""extern "C" unsigned long __stdcall inet_addr(char const *)" (?inet_addr@@$$J14YGKPBD@Z)", auf das in Funktion ""public: bool __thiscall Socket::connect(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int)" (?connect@Socket@@$$FQAE_NV?$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 (0A00036C) ""extern "C" unsigned short __stdcall htons(unsigned short)" (?htons@@$$J14YGGG@Z)", auf das in Funktion ""public: bool __thiscall Socket::bind(int)" (?bind@Socket@@$$FQAE_NH@Z)" verwiesen wird.
    1>socket.obj : error LNK2028: Nicht aufgelöstes Token (0A000397) ""extern "C" int __stdcall sendto(unsigned int,char const *,int,int,struct sockaddr const *,int)" (?sendto@@$$J224YGHIPBDHHPBUsockaddr@@H@Z)", auf das in Funktion ""public: bool __thiscall Socket::UDP_send(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int)const " (?UDP_send@Socket@@$$FQBE_NV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@0H@Z)" verwiesen wird.
    1>socket.obj : error LNK2028: Nicht aufgelöstes Token (0A000398) ""extern "C" int __stdcall WSACleanup(void)" (?WSACleanup@@$$J10YGHXZ)", auf das in Funktion ""public: void __thiscall Socket::cleanup(void)const " (?cleanup@Socket@@$$FQBEXXZ)" verwiesen wird.
    1>socket.obj : error LNK2028: Nicht aufgelöstes Token (0A000399) ""extern "C" int __stdcall recv(unsigned int,char *,int,int)" (?recv@@$$J216YGHIPADHH@Z)", auf das in Funktion ""public: int __thiscall Socket::recv(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > &)const " (?recv@Socket@@$$FQBEHAAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)" verwiesen wird.
    1>socket.obj : error LNK2028: Nicht aufgelöstes Token (0A00039B) ""extern "C" int __stdcall bind(unsigned int,struct sockaddr const *,int)" (?bind@@$$J212YGHIPBUsockaddr@@H@Z)", auf das in Funktion ""public: bool __thiscall Socket::bind(int)" (?bind@Socket@@$$FQAE_NH@Z)" verwiesen wird.
    1>socket.obj : error LNK2028: Nicht aufgelöstes Token (0A0003A0) ""extern "C" unsigned int __stdcall socket(int,int,int)" (?socket@@$$J212YGIHHH@Z)", auf das in Funktion ""public: bool __thiscall Socket::create(void)" (?create@Socket@@$$FQAE_NXZ)" verwiesen wird.
    1>socket.obj : error LNK2028: Nicht aufgelöstes Token (0A0003B9) ""extern "C" int __stdcall closesocket(unsigned int)" (?closesocket@@$$J14YGHI@Z)", auf das in Funktion ""public: virtual __thiscall Socket::~Socket(void)" (??1Socket@@$$FUAE@XZ)" verwiesen wird.
    1>socket.obj : error LNK2028: Nicht aufgelöstes Token (0A0003CD) ""extern "C" struct hostent * __stdcall gethostbyname(char const *)" (?gethostbyname@@$$J14YGPAUhostent@@PBD@Z)", auf das in Funktion ""public: bool __thiscall Socket::connect(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int)" (?connect@Socket@@$$FQAE_NV?$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 (0A0003D5) ""extern "C" int __stdcall send(unsigned int,char const *,int,int)" (?send@@$$J216YGHIPBDHH@Z)", auf das in Funktion ""public: bool __thiscall Socket::send(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)const " (?send@Socket@@$$FQBE_NV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)" verwiesen wird.
    1>socket.obj : error LNK2028: Nicht aufgelöstes Token (0A0003F2) ""extern "C" int __stdcall listen(unsigned int,int)" (?listen@@$$J18YGHIH@Z)", auf das in Funktion ""public: bool __thiscall Socket::listen(void)const " (?listen@Socket@@$$FQBE_NXZ)" verwiesen wird.
    1>socket.obj : error LNK2028: Nicht aufgelöstes Token (0A0004AB) ""extern "C" unsigned int __stdcall accept(unsigned int,struct sockaddr *,int *)" (?accept@@$$J212YGIIPAUsockaddr@@PAH@Z)", auf das in Funktion ""public: bool __thiscall Socket::accept(class Socket &)const " (?accept@Socket@@$$FQBE_NAAV1@@Z)" verwiesen wird.
    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: virtual __thiscall Socket::~Socket(void)" (??1Socket@@$$FUAE@XZ)".
    1>socket.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" int __stdcall bind(unsigned int,struct sockaddr const *,int)" (?bind@@$$J212YGHIPBUsockaddr@@H@Z)" in Funktion ""public: bool __thiscall Socket::bind(int)" (?bind@Socket@@$$FQAE_NH@Z)".
    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 __thiscall Socket::bind(int)" (?bind@Socket@@$$FQAE_NH@Z)".
    1>socket.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" int __stdcall listen(unsigned int,int)" (?listen@@$$J18YGHIH@Z)" in Funktion ""public: bool __thiscall Socket::listen(void)const " (?listen@Socket@@$$FQBE_NXZ)".
    1>socket.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" unsigned int __stdcall accept(unsigned int,struct sockaddr *,int *)" (?accept@@$$J212YGIIPAUsockaddr@@PAH@Z)" in Funktion ""public: bool __thiscall Socket::accept(class Socket &)const " (?accept@Socket@@$$FQBE_NAAV1@@Z)".
    1>socket.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" int __stdcall WSACleanup(void)" (?WSACleanup@@$$J10YGHXZ)" in Funktion ""public: void __thiscall Socket::cleanup(void)const " (?cleanup@Socket@@$$FQBEXXZ)".
    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: __thiscall Socket::Socket(void)" (??0Socket@@$$FQAE@XZ)".
    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: bool __thiscall Socket::create(void)" (?create@Socket@@$$FQAE_NXZ)".
    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 __thiscall Socket::connect(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int)" (?connect@Socket@@$$FQAE_NV?$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" struct hostent * __stdcall gethostbyname(char const *)" (?gethostbyname@@$$J14YGPAUhostent@@PBD@Z)" in Funktion ""public: bool __thiscall Socket::connect(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int)" (?connect@Socket@@$$FQAE_NV?$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" unsigned long __stdcall inet_addr(char const *)" (?inet_addr@@$$J14YGKPBD@Z)" in Funktion ""public: bool __thiscall Socket::connect(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int)" (?connect@Socket@@$$FQAE_NV?$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 send(unsigned int,char const *,int,int)" (?send@@$$J216YGHIPBDHH@Z)" in Funktion ""public: bool __thiscall Socket::send(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)const " (?send@Socket@@$$FQBE_NV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)".
    1>socket.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" int __stdcall sendto(unsigned int,char const *,int,int,struct sockaddr const *,int)" (?sendto@@$$J224YGHIPBDHHPBUsockaddr@@H@Z)" in Funktion ""public: bool __thiscall Socket::UDP_send(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int)const " (?UDP_send@Socket@@$$FQBE_NV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@0H@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 __thiscall Socket::recv(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > &)const " (?recv@Socket@@$$FQBEHAAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)".
    1>socket.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" int __stdcall recvfrom(unsigned int,char *,int,int,struct sockaddr *,int *)" (?recvfrom@@$$J224YGHIPADHHPAUsockaddr@@PAH@Z)" in Funktion ""public: int __thiscall Socket::UDP_recv(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > &)const " (?UDP_recv@Socket@@$$FQBEHAAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)".
    1>c:\users\max\documents\visual studio 2010\Projects\hello\Debug\hello.exe : fatal error LNK1120: 30 nicht aufgelöste externe Verweise.
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
    

    bitte um hilfe 😞



  • die socket lib mitlinken, heißt: dir fehlt eine bibliothek, sie ist nicht im standard enthalten.
    (ws2_32.lib)

    wo das im studio grad geht.. irgendwo unter preferences.



  • Starte über Start/Programme/Microcsoft Visual Studio/Visual Studio Tools/Visual Studio Eingabeaufforderung

    die VS - Konsole. Navigiere in das Verzeichnis, das die Quelldateien enthält. Tippe ein:
    cl /EHsc echo_server.cpp socket.cpp ws2_32.lib
    und
    cl /EHsc echo_client.cpp socket.cpp ws2_32.lib

    das sollte Dir die exe - Dateien erst mal generieren.

    In Vs 2008 Express ist es ansonsten zu finden unter:
    Projekt / Eigenschaften / Linker / Eingabe - Zusätzliche Abhängigkeiten <-- da muß dann die ws2_32.lib hinzugefügt werden; ich vermute, daß in der 2010er Version so ähnlich gehen wird.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x) in das Forum Compiler- und IDE-Forum verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • danke sxchön hat geklappt ....

    allerdings schließt sich der erzeugte cillent sofort nach der ausführung?



  • Ja, er ist ja so programmiert, daß er connectet, sendet, den Socket schließt und sich beendet.
    Oder meinst Du, daß sich das Konsolenfenster nach Programmende schließt?
    Dann öffne eine Konsole (Start/Programme/Zubehör/Eingabeaufforderung), navigiere in das Verzeichnis, das die exe-Datei enthält und starte das Programm aus der Konsole durch Eingabe des Programmnamens.



  • Ich beschreibe mein fogehen ...

    server.exe und cilent.exe befinden sich im selben odrner

    ich starte server.exe --> dieser ist leer
    benutze win7 ... beim erststart von server hat er mich gefragt(firewall) ob ich zulasse das eine verbing erstellt wird ) hab zu gesagt

    ich lasse server.exe laufen
    ich starte cilent.exe ---> fenster öffnet sich und zeigt ganz kurz
    Usage: ServerAdresse an
    dann schliest sich cilent.exe wieder

    server belibt leer ?



  • der client will beim start die serverip, bei dir wohl der localhost.

    dann gibts du erst eine zeichenkette ein, die geschickt wird.

    starte den client auf konsole (win32 eingabeaufforderung), zum bleistift mit

    client.exe localhost



  • Dankeschön jetzt klapt alles : )



  • Wie startest Du client.exe? Durch Doppelklick auf das Programmicon im Ordner? Das ist falsch, mach es aus der Konsole, wie ich es Dir beschrieben habe.

    Edit: Oh ... Seite zwei übersehen ...


Anmelden zum Antworten