SOCKET Client/Server App. Lesen und schreiben



  • ohh ja was so nen Fußballspiel am Wochenende machen können 😃

    Hast natürlich vollkommen recht.

    Aber hab da noch nen Problem will das ganze Test aber das will ned so richtige mein server (dos) gibt sofot wenn jemand was an ihm schreib:

    if(rc==0 || rc==SOCKET_ERROR)
            {
              printf("Client %d hat die Verbindung geschlossen\n",i);
              closesocket(clients[i]); // socket schliessen
              clients[i]=INVALID_SOCKET; // seinen platz wieder freigeben
            }
            else
             {
              buf[rc]='\0';
              printf("\nClient %d: %s\n\t",i,buf);
              send(clients[1],buf,strlen(buf),0);
    
    		   }
    

    sprich er schick es an alle Client zurück..

    Gut das geht auch wunderbar. soo jetzt will ich noch prüfen ob es auch ankommt:

    ich mal das so:

    while(rc!=SOCKET_ERROR)
             {
             ZeroMemory(bufferWrite,256);
             rc=recv(SocketWR,bufferWrite,256,0);
             ListBox1->Items->Add(bufferWrite);
             }
    

    Aber mach ich das stürtzt mein Programm ab, was heisst stürtzt aber aber es macht nix mehr weiter...



  • du hängst ja auch in ner schleife bis ein fehler passiert 😉



  • Das ist ja vollkommen richtig damit will ich erreichen das immer alles angefangen wird was vom server gesendet wird..



  • Ob ich es in eine Schleife packe oder nicht:

    er bleibt immer hier stehehn : rc=recv(sw,buf,256,0);



  • msdn schrieb:

    If no incoming data is available at the socket, the recv call blocks and waits for data

    benutz mal dir forensuche --> blocking socket oder nonblocking socket



  • miller_m schrieb:

    msdn schrieb:

    If no incoming data is available at the socket, the recv call blocks and waits for data

    benutz mal dir forensuche --> blocking socket oder nonblocking socket

    Ich denke mal eher der Server hat aufgelegt. SOCKET_ERROR ist -1, der rc ist aber 0, wenn der Server auflegt.

    MfG
    RB



  • rückgabewerte sind sowieso immer zu checken. und wenn nötig
    GetLastError(), in diesem Fall WSAGetLastError(), abzufragen 😉 😃



  • Das kann doch nicht mein problem sein, oder?

    den wenn ich nen anderen Client öffnen klann ich weiter auf den Server schreiben und erbekommt auch alles blos mien andere Client der die Funktion sprich die Schleife zum empfängen hat bekommt von Server nix obwohl der was schickt.

    Hier etwas code:

    Server:

    #define MAX_CLIENTS 10
    
       int startWinsock(void);
       int main()
       {
       char buf[256];
       ZeroMemory(buf, 256);
       long rc;
       SOCKET acceptSocket;
       SOCKADDR_IN addr;
       //SOCKET connectedSocket;
    
       int i;
       FD_SET fdSet;
       SOCKET clients[MAX_CLIENTS];
    
       rc=startWinsock();
    
       //Prüfen ob WinSocket gestartet ist
    
       if(rc != 0)
          {
          printf("Fehler: StartWinsock, code: %d\n", rc);
          }
       else
          {
          printf("Winsock gestartet \n");
          }
    
       //Socket erstellen
    
       acceptSocket=socket(AF_INET,SOCK_STREAM,0);
    
       if(acceptSocket==INVALID_SOCKET)
          {
          printf("Fehler: Socket konnte nicht erstellt werden, Fehler code: %d\n", WSAGetLastError());
          return 1;
          }
       else
          {
          printf("Socket wurde erstellt!\n");
          }
    
       memset(&addr, 0,sizeof(SOCKADDR_IN));  //alles auf 0 setzen
    
       addr.sin_family=AF_INET;
       addr.sin_port=htons(12345); //Port bestimmen
       addr.sin_addr.s_addr=INADDR_ANY;
    
       rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));
    
       if(rc==SOCKET_ERROR)
          {
          printf("Fehler: bind, fehler code: %d\n", WSAGetLastError());
          return 1;
          closesocket(acceptSocket);
          WSACleanup();
          }
       else
          {
          printf("Socket an Port 12345 angebunden\n");
          }
    
       rc=listen(acceptSocket,10);
    
          if(rc==SOCKET_ERROR)
          {
          printf("Fehler: Listen, fehler code: %d\n", WSAGetLastError());
          return 1;
          closesocket(acceptSocket);
          WSACleanup();
          }
       else
          {
          printf("acceptSocket (Server) ist im Listen modus\n");
          }
    
      for(i=0;i<MAX_CLIENTS;i++)
      {
        clients[i]=INVALID_SOCKET;
      }
    
      while(1)
      {
        FD_ZERO(&fdSet); // Inhalt leeren
        FD_SET(acceptSocket,&fdSet); // Den Socket der verbindungen annimmt hinzufügen
    
        // alle gültigen client sockets hinzufügen (nur die die nicht INVALID_SOCKET sind)
    
        for(i=0;i<MAX_CLIENTS;i++)
        {
          if(clients[i]!=INVALID_SOCKET)
          {
            FD_SET(clients[i],&fdSet);
          }
        }
    
        rc=select(0,&fdSet,NULL,NULL,NULL); // nicht vergessen den ersten parameter bei anderen betriebssystem anzugeben
        if(rc==SOCKET_ERROR)
        {
          printf("Fehler: select, fehler code: %s\n",WSAGetLastError());
          return 1;
        }
    
        // acceptSocket is im fd_set? => verbindung annehmen (sofern es platz hat)
        if(FD_ISSET(acceptSocket,&fdSet))
        {
          for(i=0;i<MAX_CLIENTS;i++)
          {
            if(clients[i]==INVALID_SOCKET)
            {
              clients[i]=accept(acceptSocket,NULL,NULL);
              printf("Neuen Client angenommen (%d)\n",i);
              break;
            }
          }
        }
    
       // prüfen wlecher client sockets im fd_set sind
        for(i=0;i<MAX_CLIENTS;i++)
        {
          if(clients[i]==INVALID_SOCKET)
          {
            continue; // ungültiger socket, d.h. kein verbunder client an dieser position im array
          }
          if(FD_ISSET(clients[i],&fdSet))
          {
            rc=recv(clients[i],buf,256,0);
             if(rc==0 || rc==SOCKET_ERROR)
            {
              printf("Client %d hat die Verbindung geschlossen\n",i);
              closesocket(clients[i]); // socket schliessen
              clients[i]=INVALID_SOCKET; // seinen platz wieder freigeben
            }
            else
             {
              buf[rc]='\0';
              printf("\nClient %d: %s\n\t",i,buf);
              send(clients[1],buf,strlen(buf),0);
    
    		   }
    	  }
    	}
      }
    

    Client:

    ZeroMemory(buf, 256);
       startWinsock();
       rc=startWinsock();
    
       //Prüfen ob WinSocket gestartet ist
       if(rc != 0)
          {
          ListBox1->Items->Add("Fehler: StartWinsock");
          }
       else
          {
    
          ListBox1->Items->Add("Winsock gestartet");
          }
    
       //Socket erstellen
       sw=socket(AF_INET,SOCK_STREAM,0);
    
       if(sw==INVALID_SOCKET)
          {
          ListBox1->Items->Add("Fehler: Socket konnte nicht erstellt werden");
          //return 1;
          }
       else
          {
          ListBox1->Items->Add("Socket wurde erstellt!");
          }
    
       //Verbindung zu localhost:12345
    
       memset(&addr, 0,sizeof(SOCKADDR_IN));  //alles auf 0 setzen
    
       addr.sin_family=AF_INET;
       addr.sin_port=htons(12345); //Port bestimmen
       addr.sin_addr.s_addr=inet_addr("127.0.0.1");  //localhost
    
       rc=connect(sw,(SOCKADDR*)&addr,sizeof(SOCKADDR));
    
       if(rc==SOCKET_ERROR)
          {
          ListBox1->Items->Add("Fehler: Connect gescheitert");
          }
       else
          {
          ListBox1->Items->Add("Verbindung zu localhost!");
          }
    


  • keiner ne idee

    ich hab nun noch:

    connectedSocket=accept(sw,NULL,NULL);
    

    rein gepackt aber irgendwie will das ganze nicht 😞 😞 😞 😞 😞

    Hier bleibt er stoppen:

    rc=recv(sw,buf1,256,0);
    


  • müsste es nicht so aussehen

    rc=recv(connectedSocket,buf,256,0);
    

    schau dir doch die tutorials auf www.c-worker.ch an
    bsp:
    http://www.c-worker.ch/tuts/socksrv.c
    http://www.c-worker.ch/tuts/sock.c



  • miller_m schrieb:

    müsste es nicht so aussehen

    rc=recv(connectedSocket,buf,256,0);
    

    schau dir doch die tutorials auf www.c-worker.ch an
    bsp:
    http://www.c-worker.ch/tuts/socksrv.c
    http://www.c-worker.ch/tuts/sock.c

    Soll ich lachen oder weinen ?

    Es ist doch egal ob mein SOCKET sw heisst oder connectedSocket
    und ob mein Buffer buf1 und nicht buf heisst.. das tut doch nix zur sache.



  • |23| schrieb:

    Soll ich lachen oder weinen ?
    Es ist doch egal ob mein SOCKET sw heisst oder connectedSocket
    und ob mein Buffer buf1 und nicht buf heisst.. das tut doch nix zur sache.

    willst du mich jetzt verarschen? natürlich ist egal wie deine variablen nennst (depp1 und depp2), aber wenn du die links nicht liesst ist das nicht mehr mein problem 😡 glaubst du ich / wir knallen dir nen kompletten quellcode und du kannst dann "programmieren".

    ok noch einmal
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/recv_2.asp

    msdn schrieb:

    The recv function receives data from a connected or bound socket.

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/recv_2.asp
    gibt einen socket zurück 😮 der in deinem fall "connectedSocket" 😮 😮 sachen gibst und was sagt uns dies 😕 siehe recv


Anmelden zum Antworten