Einsteiger versucht sich an DOS-Chat



  • Hiho,
    ich hab mich mal an nem kleinen DOS-Chat versucht, um nen bissl mehr über Netzwerkprogrammierung zu lernen.
    Der Chat funktioniert simpel einer ist Server, der andere Client nun wird eine Verbindung hergestellt und man kann abwechselnd ne Nachricht tippen.
    Ich habe noch keine Möglichkeit gefunden, dass man gleichzeitig schreiben und empfangen kann, da ja recv nen blocking call is.
    Wüsstet ihr vielleicht, wie ich das anstellen kann?

    Grüße
    Auron



  • Das Zauberwort heißt thread Im Web findest du sicher einige Informationen und auch Tutorials drüber. Ich glaube die Funktion in C heißt beginthread().



  • ich habs schon befürchtet *fg*
    hab schon entfernt davon gehört, wollte es aber umgehen, weils sich unglaublich kompliziert anhört...

    naja, was solls ich bin ja noch jung^^



  • Ach so kompliziert ist das gar nicht. Hab selber schon einen DOS-Chat geschrieben mit Threads 😃

    Dein Server braucht übrigens sowieso Threads, weil er sonst gar nicht mehrere Verbindungen aufbauen kann.

    Bei der Threadbehandlung unter C ist es, soviel ich noch weiß, so, dass du der Funktion beginthread() eine Funktion übergeben musst (in einem bestimmten Format) und dieser kannst du genau 1 Parameter übergeben (das kann aber auch eine Struktur sein ;)).



  • jo, ich suche mir mal wieder nen shcönes tut, ich hoffe ich find was passendes.
    also, noch is es ja nurn chat für 2, sprich also der server hat nur die aufgabe auf eine verbindung zu warten und dann mit dieser den chat zu machen...



  • du brauchst nicht unbedingt gleich mit threads einzusteigen. schau dir mal "select (...)" an



  • hmmmm... déja vu?

    irgendwo hab ich select schonmal gesehen, aber war des nicht das Ding mit Case?
    oder verplan ich des jetzt total?

    btw. wüsste ich net was mir eben genanntes bringen sollte, also denke ich mal ich verwechsel des...



  • DOS, Threads, Netzwerk? 😕
    Versteh ich den Witz nicht?



  • nicht in allem, was wie dos aussieht ist auch dos drin 😉



  • ich hab echt keinen Plan worauf er jettz hinaus will... könnte mir das mal einer erklären?

    noch was, ich finde diese selectfunktion einfach nirgends... irgendwie fühl ich mich langsam zu blöde für google



  • @Auron_X

    ganz einfach: gib zu, daß du win32 konsole meinst.. oder bist du wirklich unter dos mit 16 bit ?? 😉



  • schau dich mal bei http://www.c-worker.ch/ um.. unter winsock.

    der hat ganz gute tutorials.

    Winsock Tutorial von c-worker.ch (Teil 4: Mehrere Clients mit select())
    

    passt --



  • oh vielen dank!

    okay, ja ich bekenne mich schuldig, dann vermute ich mal ist es genau das was man auch bei USB-Geräten entdeckt, DOS kann kein USB und unter der windoof-Konsole gehts dann^^

    edit: okay, hab mir das select-tut durchgelesen, allerdings weiß ich noch nicht ganz wie ich das dazu nutzen kann...
    da ja keine nachrichten kommen können während ich die nachricht eingebe....

    ich nutze dafür gets, vllt. sollte ich mir da nochmal ne alternative zu überlegen...



  • @Bashar
    Im normalen DOS gibts natürlich keine Threads, aber es gibt Treiber, die auch DOS multithreadfähig machen können.

    Allerdings hattest du natürlich recht. Es war die Win32-Konsole gemeint. Es ist echt verführerisch das Teil DOS zu nennen 😃



  • @ Auron_X

    Ich bin übrigens auch gerade dabei ein Chatprogramm für die Win Konsole zu schreiben, um mich mit der Netzwerkprogrammierung vertraut zu machen.

    Allerdings habe ich mein Programm so aufgebaut, dass er nur die Clients verwaltet und die Daten an die Clients verteilt. Es ist also möglich mit mehr als 2 Clients zu chatten.
    Ich habe aber auch keine threads sondern Select gewählt, ich denke bei "kleineren" Netzwerkanwendungen macht sich das auch performancemäßig noch nicht so bemerkbar.

    Du kannst ja gerne mal Kontakt zu mir aufnehmen, dann können wir uns was austauschen.

    Ingmar



  • eine frage hab ich mal grad zu select:

    timeval wait;
    wait.tv_sec = 0;
    wait.tv_usec = 100;
    
    select(0,&fdSet,NULL,NULL,wait);
    

    das is jetzt mal nen auszug...

    und ich bekomme folgenden Fehler:
    106 C:\Dokumente und Einstellungen\Sandbrink\Eigene Dateien\C++ Files\netzwerk\main.cpp
    cannot convert `timeval' to `const timeval
    ' for argument `5' to
    *

    wisst ihr was das bedeutet?



  • Hallo,

    der 5.Parameter für select ist ein Zeiger, also muß die Adresse der timeval-struct übergeben werden (beim zweiten Parameter hast du es richtig erkannt):

    timeval wait;
    wait.tv_sec = 0;
    wait.tv_usec = 100;
    
    select(0,&fdSet,NULL,NULL,&wait);
    

    MfG



  • ah geil, danke!

    edit: so, jetzt läuft das auch alles erstmal so wies soll... noch nen bisserl bugs suchen und dann werd ich den nächsten schritt machen.



  • neues Problem...

    ich muss schaun wann es auftritt, also mein programm stürzt manchmal ab... derzeit weiß ich nur, dass es NICHT passiert wenn der client mit dem server verbunden ist und sonst nix passiert...


Anmelden zum Antworten