C++ Netzwerk-/Socketprogrammierung



  • Hallo,
    ich möchte gerne mit der Netzwerk-/Socketprogrammierung, doch muss man dazu ja die ws2_32.lib oder die libws2_32.lib einbinden habe ich Recht ? Wie bindet man diese denn ein ? (Ich nutze Visual Studio 2010 Express).

    Bei meinen Versuchen sie einzubinden kommt diese Fehlermeldung:
    1>LINK : fatal error LNK1104: Datei "libws2_32.lib" kann nicht geöffnet werden.

    Kennt jemand gute Tutorials zu diesem Thema ?

    Gruß
    Silent12



  • Sie heißt ws2_32.lib, hast du echt nichtmal beide dir bekannten Varianten ausprobiert, bevor du hier gefragt hast?



  • silent12 schrieb:

    Kennt jemand gute Tutorials zu diesem Thema ?

    Ob es gut ist, weiß ich nicht:
    http://www.c-worker.ch/



  • Diese habe ich unter Projekteigenschaften/Linker/eingabe/zusätzliche Abhängigkeiten eingetragen, doch dann bekomme ich bei meinem Code den ich aus meinem aktuellen Tutorial habe diese Error:

    1>MSVCRTD.lib(crtexe.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_main" in Funktion "___tmainCRTStartup".
    1>C:\Users\silent1297\documents\visual studio 2010\Projects\WINSOCK_socketprogrammierung\Debug\WINSOCK_socketprogrammierung.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.

    Kann mir jemand damit helfen, oder mir ein "gutes" Tutorial zeigen ?

    Danke schonmal 🙂

    Gruß
    silent12



  • Klingt für mich so, als hättest Du kein Konsolenprojekt angelegt, aber eine main - Funktion definiert ...



  • Habe es als Konsolenprogramm probiert und als Windowsprogramm, aber beides mal der gleiche Error.

    Mein Code(aus dem Tutorial auch schön kommentiert):

    //Include the needed header files.
    //Don't forget to link libws2_32.a to your program as well
    #include <winsock.h>
    
    SOCKET s; //Socket handle
    
    //CONNECTTOHOST – Connects to a remote host
    bool ConnectToHost(int PortNo, char* IPAddress)
    {
        //Start up Winsock…
        WSADATA wsadata;
    
        int error = WSAStartup(0x0202, &wsadata);
    
        //Did something happen?
        if (error)
            return false;
    
        //Did we get the right Winsock version?
        if (wsadata.wVersion != 0x0202)
        {
            WSACleanup(); //Clean up Winsock
            return false;
        }
    
        //Fill out the information needed to initialize a socket…
        SOCKADDR_IN target; //Socket address information
    
        target.sin_family = AF_INET; // address family Internet
        target.sin_port = htons (PortNo); //Port to connect on
        target.sin_addr.s_addr = inet_addr (IPAddress); //Target IP
    
        s = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP); //Create socket
        if (s == INVALID_SOCKET)
        {
            return false; //Couldn't create the socket
        }  
    
        //Try connecting...
    
        if (connect(s, (SOCKADDR *)&target, sizeof(target)) == SOCKET_ERROR)
        {
            return false; //Couldn't connect
        }
        else
            return true; //Success
    }
    
    //CLOSECONNECTION – shuts down the socket and closes any connection on it
    void CloseConnection ()
    {
        //Close the socket if it exists
        if (s)
            closesocket(s);
    
        WSACleanup(); //Clean up Winsock
    }
    

    Komme einfach nicht weiter alles schon probiert 😕

    Gruß
    silent12



  • Du hast keine main - Funktion!



  • Einfach in ein Header oder Source File folgende Zeile einfügen:

    #pragma comment (lib, "ws2_32.lib")
    


  • Die Zeile: #pragma comment (lib, "ws2_32.lib") ändert auch nichts...wie kann ich da die main-function einbauen ?

    Gruß
    silent12



  • Schreib unter Deinen obigen Quelltext folgende Zeilen:

    int main()
    {
    }
    


  • Perfekt thx klappt :)...gehört da nicht noch ein return 0; rein ?

    Gruß
    silent12



  • Wenn du schnell zu einem Ziel kommen willst, kann ich dir SFML.Network empfehlen. Wäre plattformunabhängig, bietet wahrscheinlich aber weniger Low-Level-Konfigurationsmöglichkeiten.



  • silent12 schrieb:

    Perfekt thx klappt :)...gehört da nicht noch ein return 0; rein ?

    Gruß
    silent12

    Nein. Bei main() ist return 0 optional.



  • Führt man Winsocket Programme standartmäßig als Konsolenanwendung aus ?

    Gruß
    silent12



  • hi

    nein. sockets kannst du in jeder art von anwendung verwenden. ich glaub das es erst bei driver-entwicklung einschraenkungen gibt.
    du kannst dir sockts wie dateien vorstellen.

    das ist ein recht gutes buch zur socket programmierung welches ich gerne verwende. vielleicht bekommst du das ja in einer bibliothek zum ausleihen.

    Meep Meep



  • Danke für die vielen Tipps 🙂

    Eine Frage hätte ich trotzdem noch:
    Wenn ich die main-function einfach nur ans Ende hinsetze, dann kann ich doch in dem Code darüber keine Ausgaben machen oder ?
    Wenn doch wie würde das gehen ? Mit Funktionsaufrufen ?

    Gruß
    Tim



  • Lies dir doch lieber erstmal ein ordentliches Buch zum Thema C++ durch, bevor du dich mit etwas befasst von dem du nicht einmal 10 Prozent verstehst.



  • Auf genau so eine Antwort habe ich irgendwie schon gewartet. 😃
    Aber damit das nicht so bleibt und ich außer Schleifen und Arrays... nichts mit C++ kann, will ich mehr lernen.
    Nur finde ich immer nur Tutorials generell zu C++ die nur Schleifen, Arrays,... erklären und nicht tiefergehen.
    Deshalb wollte ich jetzt mit der Socket-Programmierung anfangen, da es dort wenigstens andere Tutorials gibt 🙂

    Würde mich SEHR über gute Tutorials (siehe oben) freuen.

    Gruß
    Tim



  • In Socket-Tutorials wird erklärt wie man mit Sockets umgeht - C++ wird dir da keines beigebracht.
    Und da fehlt's noch an ganz grundlegenden Dingen wenn du Fragen stellst wie...

    Wenn ich die main-function einfach nur ans Ende hinsetze, dann kann ich doch in dem Code darüber keine Ausgaben machen oder ?
    Wenn doch wie würde das gehen ? Mit Funktionsaufrufen ?




Anmelden zum Antworten