(Win)sock(ets)



  • Moin, also ersma: ich bin c++ n00b (allerdings umsteiger von java)
    (und auch neu hier aufm baord ("Hallo Board!!! :D", also nich hauen, falls der thread doch ins windows forum gehört hätte)

    ich hab mir also gestern und heute mal einen abgebrochen irgendwas mit sockets zu programmieren
    (sowas wie n chat, wobei jede seite sowohl server als auch client sein kann, je nachdem, wer zuerst connected)

    mittlerweile hab ichs geschafft:
    -Winsock zu initialisieren
    -nen listen socket zu bauen
    -den zu binden
    -auf den listen socket zu connecten
    -den connect zu aktzeptieren
    -nen string zu senden
    -und ihn zu empfangen

    ABER das alles nur sequentiell
    ich hab für alles da oben ne eigene methode geschrieben und wenn ich die hintereinander ausführe funktioniert das auch einwandfrei

    allerdings steh ich jetz auffem schlauch, was die dynamik angeht

    wie kann ich zum beispiel erreichen, dass ich jetzt sachen senden kann und aber auch gleichzeitig empfangen?

    ich kann ja nicht ständig meine receive methode aufrufen.
    gibts es sowas wie systemevents wie "neue Nachricht erhalten, bitte receiven"
    oder irgendwie sowas, dass ich abfragen kann (und wenn ja, wie?)?

    und bitte schmeisst mich net mit tuts zu
    die hab ich fast alle gelesen
    haben mir bis hierhin auch gut weitergeholfen, aber jetz is ende?

    kann mir also wer helfen?? bitte

    (falls es ne rolle spielt: ich benutz den c++ builder)



  • hi, ich glaub du suchst WSAAsyncSelect 🙄



  • Hm, im VCL Forum oder in WinAPI wärst du wohl besser aufgehoben...

    Devil



  • ok, sorry fürs falschposten

    das mit dem WSAAsyncSelect hab ich schon vermutet, aber so wie das in den tuts eingebaut ist, versteh ich das leider nicht

    wie genau muss ich das denn in meine WinMain() einbauen um damit arbeiten zu können?

    [ Dieser Beitrag wurde am 03.07.2003 um 18:20 Uhr von M@xwell editiert. ]



  • Hi,

    was du auch machen kannst:

    du akzeptierst beim host 2 sockets (for-schleife) und der client connected 2 sockets zum host( über den selben port). Nun hast du einen stream zum senden und den anderen zum empfangen. Achte bitte darauf, die receive funktion beider (des clients und des hosts) in einen thread zu packen, sonst reagiert dein programm solange nicht, bis es eine nachricht bekommen hat.



  • Naja das geht natürlich über Messages viel eleganter und Win-API konformer:

    #define WM_SOCKET_NOTIFY (WM_APP+1)
    
    WSAAsyncSelect(socketEMPFANG,hwnd,WM_SOCKET_NOTIFY,FD_ACCEPT); // Nach dem Erstellen eines Empfangs-Sockets wird eine selbstdefinierte Nachricht an das Empfänger-Fenster geschickt, hier nur FD_ACCEPT für eine akzeptierte Verbindung (siehe MSDN)
    
    // in der Fenster-Prozedur von hwnd wird die Nachricht dann folgendermaßen ausgewertet
    // ...
    
    switch(message)
    {
        case WM_SOCKET_NOTIFY:
    
            switch(wParam)
            {
                case socketEMPFANG:
    
                    if(lParam==FD_ACCEPT)
                    {
                        socketVERBINDUNG=accept(socketEMPFANG,(SOCKADDR*)&verbindungsadress,&iGroesse);
                        WSAAsyncSelect(socketVERBINDUNG,hwnd,WM_SOCKET_NOTIFY,FD_READ);
                    }
    
                    return TRUE;
    
                case socketVERBINDUNG:
    
                    if(lParam==FD_READ)
                    {
                        ilen=recv(socket,szNachricht,MAX_PATH,0);
                        szNachricht[ilen]='\0';
                        MessageBox(NULL,sznachricht,"Neue Nachricht angekommen !",0);
                    }
    
                    return TRUE;
            }
    
            return TRUE;
    
    // ...
    

    [ Dieser Beitrag wurde am 03.07.2003 um 22:42 Uhr von BiGFusel editiert. ]



  • jo, vielen dank
    ich denke damit hätte es funktioniert
    jetz hab ich das allerdings mit dem klick und fertig system vom builder gemacht
    (am anfang vielleicht einfacher)
    allerdings hab ich jetz n neues problem
    die exe will immer 2 dateien im verzeichnis haben, aber ich will nich, dass die das will
    wer mal gucken möchte: hier

    [ Dieser Beitrag wurde am 04.07.2003 um 01:01 Uhr von M@xwell editiert. ]


Anmelden zum Antworten