Socketprogrammierung



  • ich bitte um hilfe und nicht um Blöde Sprüche..



  • Bitte lesen, dort ist alles sehr gut erklärt:
    http://beej.us/guide/bgnet/



  • Da mein Englisch nicht so gut ist und es keine Deutsche übersetzung gibt verstehe ich ned alles, gibts vllt. ne Alternative zu dieser Einführung?



  • Da ich keine Ahnung habe wie es mit deinen generellen Programmierkenntnissen
    aussieht, frag ich einfach mal, ob du pro accept() einen neuen Thread startest?

    Gruß,
    CSpille

    EDIT: Etwas Code wäre natürlich auch hilfreich 😉



  • Deyta schrieb:

    Da mein Englisch nicht so gut ist und es keine Deutsche übersetzung gibt verstehe ich ned alles, gibts vllt. ne Alternative zu dieser Einführung?

    Klar gibt es das:
    http://www.amazon.de/First-Class-Sprachkurs-Englisch-9-0/dp/3897479532/ref=sr_1_4?ie=UTF8&s=software&qid=1272707416&sr=8-4



  • Da ich nicht weiß was für dich hilfreich wäre am Code, post ich dir mal die ganze server.cpp

    #include <windows.h>
    #include <winsock2.h>
    #include <iostream>
    #include <string>
    #include "header.h"
    using namespace std;
    
    int keylogger();
    int startWinsock(void);
    
    int main()
    {
        long rc;
        SOCKET datenaustausch;
        SOCKET acceptSocket;
        char buf[256];
        SOCKET connectedSocket;
        SOCKADDR_IN addr;
        rc=startWinsock();
    
        if(rc!=0)
        {
                 cout << "Fehler: startWinsock, fehler Code: %d" << endl << rc;
        }
        else
        {
            cout << "Winsock gestartet!" << endl;    
        }    
        acceptSocket=socket(AF_INET,SOCK_STREAM,0);
        if(acceptSocket==INVALID_SOCKET)
        {
                             cout << "Socket konnte nicht erstellt werden, fehler Code: %d" << endl << WSAGetLastError();
        }
        else
        {
            cout << "Socket erstellt!" << endl;
        }
        memset(&addr,0,sizeof(SOCKADDR_IN));
        addr.sin_family=AF_INET;
        addr.sin_port=htons(12345);
        addr.sin_addr.s_addr=ADDR_ANY;
        rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));
    
        if(rc==SOCKET_ERROR)
        {
                            cout << "Fehler: bind, fehler code: " << WSAGetLastError();
        }
        else
        {
            cout << "Socket an port 12345 gebunden\n";
        }
        rc=listen(acceptSocket,10);
        if(rc==SOCKET_ERROR)
        {
                            cout << "Listen Fehler";
        }
        else
        {
            cout << "acceptSocket ist im listen Modus" << endl;
        }
        connectedSocket=accept(acceptSocket,NULL,NULL);
        if(connectedSocket==INVALID_SOCKET)
        {
                                           cout << "Fehler connected";
        }
        else
        {
            cout << "Neue Verbindung akzeptiert!" << endl;
        }
        while(rc!=SOCKET_ERROR)
        {
                               rc=recv(connectedSocket,buf,256,0);
                               if(rc==0)
                               {
                                        cout << "Server hat die Verbindung getrennt";
                               }
                               cout << "Client sendet: " << buf << endl << endl;
                               cout << "fdsa schreibt: ";
                               cin >> buf;
                               send(connectedSocket,buf,256,0);
                               getchar();
                               cout << endl << endl;
        }
    
        getchar();
    }
    int startWinsock(void)
    {
      WSADATA wsa;
      return WSAStartup(MAKEWORD(2,0),&wsa);
    }
    


  • Wie soll dein Server denn einen zweiten Client annehmen, wenn du nur einmal accept aufrufst?



  • genau, was ich erwartet habe...

    Wenn du mehrere Client-Anfragen mit einem blocking socket gleichzeitig verarbeiten möchtest, wirst du für jede eingehende Verbindung einen neuen Thread starten müssen.

    do {
    connectedSocket=accept(acceptSocket,NULL,NULL);
    startThread(connectedSocket);
    while(connectedSocket!=INVALID_SOCKET)
    

    Wie du den Thread in der function startThread startest, kannst du selbst entscheiden.
    Ich empfehle dir einfach mal boost::thread
    http://www.boost.org/doc/libs/1_42_0/doc/html/thread.html

    Hier findest du ein Beispiel für die Verwendung von boost:thread
    http://www.ureader.de/msg/12291735.aspx

    Für deinen Fall bedeutet das:
    Du erstellst ein Objekt, das connectedSocket als Parameter übergeben kriegt.
    Diesen Parameter schreibst du dir in ein Feld in deinem Objekt.

    Dann brauchst eine Function void operator()() in deinem Objekt.
    Diese wird beim Starten des Threads aufgerufen.
    Wegen der Vollständigkeit erwähne ich noch, dass dein Objekt einen
    Copy-Konstruktor benötigt. (Das braucht dich in deinem Fall wohl weniger interessieren)

    Gruß,
    CSpille



  • Warum nicht gleich boost.asio?
    Simon



  • Du brauchst einen neuen Thread für jeden Client oder musst dich mit select oder einer vergleichbaren Funktion anfreuden.

    Deutsche Tutorials gibt es hier:
    http://c-worker.ch/tuts.php

    Interessant ist Tutorial 4 für dich.



  • theta schrieb:

    Warum nicht gleich boost.asio?
    Simon

    Ich persönlich hätte auch boost asio genommen.
    Allerdings ändert das nichts an seinem generellen Problem, oder?



  • Danke für die Antworten 🙂
    Ich werde mir mal alles in Ruhe anschauen zum Thema Thread's da ich mich damit überhaupt nicht auskenne. Falls ich nicht weiterkommen sollte werd ich bescheid geben. :p



  • CSpille schrieb:

    theta schrieb:

    Warum nicht gleich boost.asio?
    Simon

    Ich persönlich hätte auch boost asio genommen.
    Allerdings ändert das nichts an seinem generellen Problem, oder?

    Hier im forum werden oft Standardantworten nachgeplappert, ohne die Frage richtig zu lesen.



  • Hätte mal ne nebenfrage, wie mach ich es das der Server bei jedem Booten sich von selbst öffnet? Will es ned Manuell machen per "neuer Autostart" sonder lieber mit nem Code der wenn man den Server öffnet automatisch sich in den Autostart einfügt.



  • Deyta schrieb:

    Hätte mal ne nebenfrage, wie mach ich es das der Server bei jedem Booten sich von selbst öffnet? Will es ned Manuell machen per "neuer Autostart" sonder lieber mit nem Code der wenn man den Server öffnet automatisch sich in den Autostart einfügt.

    Platformabhängig und die extrem schlechtere Wahl.



  • Deyta schrieb:

    Da mein Englisch nicht so gut ist und es keine Deutsche übersetzung gibt verstehe ich ned alles, gibts vllt. ne Alternative zu dieser Einführung?

    http://translate.google.com/



  • Janjan schrieb:

    Deyta schrieb:

    Hätte mal ne nebenfrage, wie mach ich es das der Server bei jedem Booten sich von selbst öffnet? Will es ned Manuell machen per "neuer Autostart" sonder lieber mit nem Code der wenn man den Server öffnet automatisch sich in den Autostart einfügt.

    Platformabhängig und die extrem schlechtere Wahl.

    Platform: Windows 7, wenns geht dann auch für XP + Vista, vllt mit ner if abfrage möglich..

    Warum ist das eine schlechte Wahl? Antiviren Programme oder Messenger's haben doch die gleiche Funktion.



  • BTW zum Google Translater.. wir wissen doch alle das der nicht 1:1 übersetzt.



  • Gibt es keine andere möglichkeit ausser des mit den Theard's?
    Und was ist jetzt zum Thema Autostart: Platform für Windows XP, Vista und für 7.



  • Deyta schrieb:

    Gibt es keine andere möglichkeit ausser des mit den Theard's?

    Es gibt ne Alternative zu ThReads, aber die ist wesentlich komplizierter...

    Deyta schrieb:

    Und was ist jetzt zum Thema Autostart: Platform für Windows XP, Vista und für 7.

    Falsches Forum...
    Ich vermute mal du kannst dazu nen Eintrag in der Registrierung anlegen.


Anmelden zum Antworten