Simpler Chat mit Winsock



  • Leute ich brauch hilfe, ich bekomms net hin, Codesnippets wären auchnet schlecht (von nem einfach chat mit winsock (in C)

    und zwar in der hauptschleife, wenn man das nur so macht:

    while(1)
    {
    recv(.....);
    send(.....);
    }

    also bei server und client, dannkann man ja immer nur exakt abwechselnd was senden/empfangen. das ist ja gay, als alternative habe ich versucht es mit if zu prüfen, ob was empfangen wurde:

    while(1)
    {
    memset(buffer,'\0',200);
    if(recv(s,buffer,sizeof(buffer),0) == 1)
    {
    printf("\nreceived > %s\n",buffer);
    }

    Sleep(200);
    scanf("%s",buffer);
    send(s,buffer,strlen(buffer),0);

    }

    das funzt leider auchnicht (netmal abwechselnd)

    es sollte erstmal noral in der konsole funktionieren (um die funktionsweise zu verstehen)

    Wobei mich es auch interessieren würde wie es mit switch und case bei winapi funzt

    switch (message)

    case

    da sieht das ja llgemein anderst aus...

    Naja würde beides gerne wissen, danke schonmal.

    gruss GiGaGast



  • ich habe mir das jetzt nicht alles durchgelesen, aber junge, arbeite mit threads! auf c-worker.ch gibt es tuts über winsock und zu threads gibt es unter google auch einiges



  • Toll Peter

    was soll das denn heissen?

    Ich will einfach senden/empfangen unabhängig voneinander in der konsole und/oder/auch mit gui...

    gruss



  • Dazu wirst du aber wirklich threads brauchen.

    MfG



  • c-worker.ch wurde ja schon genannt... wie wäre es wenn man sich da einfach mal bisschen umguckt? Da gibts auch ein Bspl das ohne Threads auskommt(Console wohl gemerkt^^)



  • sorry hab soviel gekifft das ich das wohl übersehen hab. danke.



  • nett welche kommentare mit framden namen geschrieben werden, könnt ja mal spasseshalber die ip's vergleichen ;>

    gruss



  • ihr wärdet feststellen das die ip's gleich sind ;o



  • das wüsste ich jetzt aber mal genauer 🙂

    ...



  • ich habe einen trojaner bei dir installiert und schicke beiträge über deinen rechner ab

    gruss



  • Jo, sowas habe ich mir schon gedacht... xD

    Leider bist du in dieser beziehung an der völlig flaschen Adresse
    kannst mir aber gerne mal meine aktuelle IP zeigen, die du sicher wissen wirst..

    gruss



  • ok ich muss threads benutzen

    kann closed werden

    gruss



  • Ich hab den Trojaner jetzt gefunden!

    gruss



  • GiGaGast schrieb:

    ich habe einen trojaner bei dir installiert und schicke beiträge über deinen rechner ab

    gruss

    Das bezweifle ich bei deinen winsock-kenntnissen 😃 .
    Aber ich glaube ich hab dich richtig verstanden: du willst ne simple server-client konsolenandwendung schreiben. ich weiss ja nich wie dein code im ganzen aussieht aber zuersteinmal solltest du winsock initialisieren, dann, falls du tcp verwendest, musst du dich natürlich verbinden (auf der serverseite kommt noch bind(), listen(), accept() hinzu - ziemlich unschöne angelegenheit das winapi zeugs). anders gehts auch über udp (was ich allerdings nie verwende). was hier alle mit threads meinen: wenn man mehrere clients an einem server haben will dann braucht jede verbindung einen eigenen thread (oder prozess) allerdings ist das am anfang auch eine aufwendige geschichte (man könnte anstatt threads auch select() verwenden, was es für windows und linux gibt). aber ich würde erstmal vorschlagen: zeig mal den kompletten code her.



  • lol, lustig bist du ja schon...

    ich sagte ja, in dieser beziehung bist du bei mir völlig flasch, da ich selbst 2 verschiedene trojaner programmiert habe und die funktionsweisen solcher teile genaustens kenne.

    es tauchen ausser den instant messenger verbindungen keine anderen auf.
    es tauchen auch keine anderen prozesse auf die nicht auf meinem pc gehören.

    Naja wie alt bist du? 14 - 16? nunja egal...

    macht mal bitte diesen thread zu das thema hat sich erledigt, ich werde nach threads schauen.

    gruss



  • Se_Godfaser, danke ich weis schon wie das funzt mit mit bind(), accept(), initiallisieren etc pp... ging halt nur um die threads, die sache hat sich erledigt... ich suche mal lieber woanders weiter (um solchen witzbolden aus dem weg zu gehen ;>)

    gruss again^^



  • Ich hasse euch alle 🤡 🤡 🤡 🤡 🤡 🤡

    gruss



  • Dafür braucht man nich threads...!
    Die Schleife is schon Ok dann mit select und damit man parallel empfangen senden kann und auch noch tippen ... ließ nich mit cin oder so ein sondern les den tastatur buffer aus. Hatte GENAU das selbe problem.
    Ich poste dann einfach mal den Code:

    #include <winsock2.h>
    
    #include <iostream>
    #include <conio.h> 
    #include <string>
    
    using namespace std;
    
    int startWinsock(void);
    char* HostByName();
    
    int main()
    {
    
      long rc;
      SOCKET s;
      SOCKADDR_IN addr;
      char buf[1302];
      FD_SET fdSet;
      char buffer;
      string input;
    
      int choice;
      char IP[18];
    
      timeval timeout;
    
      timeout.tv_sec = 0;
      timeout.tv_usec = 1;
    
      rc=startWinsock();
      if(rc!=0)
      {
        printf("Fehler: startWinsock, fehler code: %d\n",rc);
        return 1;
      }
      else
      {
        printf("Winsock gestartet!\n");
      }
    
      s=socket(AF_INET,SOCK_STREAM,0);
      if(s==INVALID_SOCKET)
      {
        printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError());
        return 1;
      }
      else
      {
        printf("Socket erstellt!\n");
      }
      cout << "-----------------------------" << endl ;  
      cout << "Chat 2.0 *Von Christopher P.*" << endl ;
      cout << "-----------------------------" << "\n\n" ;
    
      memset(&addr,0,sizeof(SOCKADDR_IN)); 
      addr.sin_family=AF_INET;
      addr.sin_port=htons(1234);   
    
      cout << "Wollen Sie einen Hostnamen oder eine IP-Addresse eingeben ? \n[1]->Hostname\n[2]->IP-Addresse\n\n" ;
      cin >> choice;
      while(true)
      {
          if(choice == 1)
          {
              strcpy(IP, HostByName());         
              break;        
          }
    
          else if(choice == 2)
          {
              cout << "\n\nInput : "; 
              cin >> IP; 
    
              break;      
          }
    
          else
          {
              cout << "Falsche Eingabe!" << endl;    
              continue;
          }
      }
    
      addr.sin_addr.s_addr = inet_addr(IP);
    
      rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
      if(rc==SOCKET_ERROR)
      {
        printf("Fehler: connect gescheitert, fehler code: %d\n",WSAGetLastError());
        return 1;
      }
      else
      {
        cout << "--> Verbunden mit [" << IP << "]...\n\n\n" << endl;
        printf("(Um bereits eingegebenes wieder zu loeschen druecken Sie ESCAPE)\n");
        printf("(Um die Verbindung zu trennen 'disconnect' eingeben!)\n");
      }
    
      while(1)
      {
    
            FD_ZERO(&fdSet);        
            FD_SET(s,&fdSet);
    
            rc=select(0,&fdSet,NULL,NULL,(timeval*)&timeout);
    
                if(rc==SOCKET_ERROR)
                {
                    cout << "select() error , code : " << WSAGetLastError << endl;
                }
    
                if(FD_ISSET(s,&fdSet))
                {
    
                        rc=recv(s,buf,1302,0);
    
                        if(rc==0 || rc==SOCKET_ERROR)
                        {
                            cout << "Verbindung beendet" << endl;
                            closesocket(s); 
                            break;
                        }   
    
                        else
                        {
    
                            buf[rc]='\0';
                            cout << "\n" << buf ;  
                            cout << "\n->Tippe eine Nachricht ein! : \n" << input;
                        }                                                                   
                }
    
         if(kbhit()) 
         {       
            char buffer = getch();  
    
            if (buffer != 0)
            {
                if (buffer != 13 && buffer != 8) 
                { 
                    input.push_back(buffer);
                    cout << buffer;
                }
    
                if (buffer != 8 && buffer == 27)
                {
                    input.clear();
                    cout << "\n->Tippe eine Nachricht ein! : \n";                
    
                }
    
                if (buffer == 13 && buffer != 8)  
                {    
                      send(s,input.c_str(),1024,0);
    
                }
    
                if (input == "disconnect" && buffer == 13)
                {
    
                      closesocket(s);    
                      WSACleanup();    
                      break;
                }
    
                if (buffer == 13 && buffer != 8)  
                {    
    
                      input.clear();
                }            
    
              }  
           }         
       }
    
      cout << "\n\n\n -> Verbindung beendet!" << "\n\n Zum Beendet bitte eine Taste druecken..." << endl;
      getch();
    
      WSACleanup();
      return 0;
    }
    
    int startWinsock(void)
    {
      WSADATA wsa;
      return WSAStartup(MAKEWORD(2,0),&wsa);
    }
    
    char* HostByName()
    {
      HOSTENT* he;
      char hostname[256];      
      int i=0;
      IN_ADDR addr;  
    
      cout << "\n\nInput : ";  
      cin >> hostname;
    
      he=gethostbyname(hostname);
    
      cout << "\nHostname: " << he->h_name << endl;
    
      while(he->h_addr_list[i])  
      {
    	  addr.s_addr = * ( (long*) he->h_addr_list[i++] );
    
    	  cout << "Ip Address: " << inet_ntoa(addr) << endl;
      }
    
      return inet_ntoa(addr);
    }
    

    Kann dir jetzt nich alles erklären. Du wirst das bestimmt verstehen 😉

    Gruß Chris



  • Foxx90 schrieb:

    Dafür braucht man nich threads...!
    Die Schleife is schon Ok dann mit select und damit man parallel empfangen senden kann und auch noch tippen ... ließ nich mit cin oder so ein sondern les den tastatur buffer aus. Hatte GENAU das selbe problem.

    Naja ist aber irgendwie sehr dirty. Außerdem kann er dann seine GUI vergessen.



  • Warum is das dirty? Für die Konsole is das eine SEHR GUTE Lösung. Immerhin kann mann alles gleichzeitig machen. Und wem das nicht gefällt, dass der immer weiter Scrollt kann man auch SetConsolePosi... Aber ich wollts Platform (zumindest weitgehend) unabhängig machen ! Und doch das geht auch in einer GUI, dann musst du das einfach nur die ganze Zeit in der WinMain Schleife ablaufen lassen. Habs ja auch noch mal als GUI. Naja, aufjeden Fall is das ne Gute Lösung. Finde ich.

    Grruß Chris



  • ich denke es sind eher so sachen wie

    if (input == "disconnect" && buffer == 13)
    

    gemeint 😕


Anmelden zum Antworten