socket client-> auf antwort warten und gleichzeitig eingaben empfangen



  • hio

    short int rc;
      SOCKET s;
      SOCKADDR_IN addr;
      FD_SET fdset;
      char antwort[200];
      int ilen;
      char buf[200];
    
    rc=startWinsock();
    
      s=socket(2,SOCK_STREAM,0);
    
      memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten 
      addr.sin_family=2;
      addr.sin_port=htons(12345); // wir verwenden mal port 12345
      addr.sin_addr.s_addr=inet_addr("127.0.0.1"); // zielrechner ist unser eigener
      rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
      send(s,getNachricht(hwndNick),100,0);
    do{
      select(0,&fdset,NULL,NULL,NULL);
      rc=recv(s,antwort,256,0);
      if(rc!=0)
      {
         antwort[rc]='\0';
         SendMessage(hwndGet,WM_SETTEXT,0,(long)antwort);
       }
      }while(true);
    

    durch die fußgesteuerte schleife stürzt mein programm ab..wie wende ichd as select an, mache ich etwas falsch?
    cYa



  • danke bashar

    rulzmaker, da fehlen jetzt die FD_-Makros. Ausserdem muss das erste Argument für select der Deskripter mit der höchsten Nummer + 1 sein, also hier s+1.



  • hi

    fd_makros..hu?

    void startVerbindung()
    {
      rc=startWinsock();
    
      s=socket(2,SOCK_STREAM,0);
    
      memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten 
      addr.sin_family=2;
      addr.sin_port=htons(12345); // wir verwenden mal port 12345
      addr.sin_addr.s_addr=inet_addr(getNachricht(hwndHost)); // zielrechner ist unser eigener
      rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
      send(s,getNachricht(hwndNick),100,0);
    
      select(0,&fdset,NULL,NULL,NULL);
      FD_ZERO(&fdset);
      FD_SET(s,&fdset);
      rc=recv(s,antwort,256,0);
      if(rc!=0)
      {
         antwort[rc]='\0';
         SendMessage(hwndGet,WM_SETTEXT,0,(long)antwort);
       }
    }
    

    s+1 ist nur für linux relevant nicht jedoch für windows.

    cYa



  • rulzmaker schrieb:

    fd_makros..hu?

    FD_ZERO, FD_SET um den socket hinzuzufügen. Das muss vorm select()-Aufruf passieren.

    s+1 ist nur für linux relevant nicht jedoch für windows.

    achso



  • hi

    void startVerbindung()
    {
      rc=startWinsock();
    
      s=socket(2,SOCK_STREAM,0);
    
      memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten 
      addr.sin_family=2;
      addr.sin_port=htons(12345); // wir verwenden mal port 12345
      addr.sin_addr.s_addr=inet_addr(getNachricht(hwndHost)); // zielrechner ist unser eigener
      rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
      send(s,getNachricht(hwndNick),100,0);
    do{
      select(0,&fdset,NULL,NULL,NULL);
      rc=recv(s,antwort,256,0);
      if(rc!=0)
      {
         antwort[rc]='\0';
         SendMessage(hwndGet,WM_SETTEXT,0,(long)antwort);
       }
       FD_ZERO(&fdset);
       FD_SET(s+1,&fdset);
      }while(true);
    }
    

    es endet wieder in der endlosschleife..whyy

    cYa



  • hi

    weiß denn keiner was an dem select falsch ist?

    cYa



  • Mann,

    macht ihr sowas im wirklichen Leben?

    So macht man dass

    1 Hauptthread, der verwaltet 2 Kommunikationsthreads. Die Komm.Threads werfen ein Event, falls es neue Eingaben gibt, der Hautpthread empfängt die Events und reagiert drauf.

    Und schon muss niemand auf den anderen warten.

    Braucht man noch eine weitere eingabe möglichkeit, so macht man nen zusätzlichen Kom.Thread (z.B. Seriell)

    mfg



  • Hi Gast,

    schon mal dran gedacht, wie langsam das Programm dann wird, wenn du erstmal einige hundert Sockets = Threads hast?

    ChrisM



  • Ist doch egal, dann kauft man halt mehr Hardware. So wird das gemacht! 😉



  • hi

    ich möchte das gerne mit dem select erstmal lösen...ich komme einfach nicht weiter

    cYa


Anmelden zum Antworten