Fehler mit Sockets



  • Ich habe einen Server Programmiert und einen Client in VB ich schaffe es das sich der Client mim Server verbindet.Ich schaffe es auch "Wörter" zu senden.
    Leider werden diese Wörter erst ausgegeben wenn ich die Verbindun trenne.
    Dann versuche ich das gesendete Wort zu Überprüfen (Wort = Test)
    dies geht leider auch nicht.
    Ich hoffe jemand kann mir helfen



  • Nö. Zu ungenaue Problembeschreibung.



  • Ich kenn mich in VB nicht so aus. Aber ich denk ma das die wörter in nem buffer gespeichert sind falls es so einen gibt.

    MFG Pacino



  • keksekekse schrieb:

    Nö. Zu ungenaue Problembeschreibung.

    ironie
    meine kristallkugel sagt mir .... ..... ..... .....
    .... ..... Peep Peep Peep kein Quellcode in dieser Frage ... ... ...

    /ironie

    mal was konkreteres, mustmaßungen helfen dir sicher genausowenig wie deine fragestellung uns

    also bitte Quelltexte (sinnvolle ausschnitte) oder eine möglichst exakte beschreibung



  • Des ist mein Code:

    #include <winsock2.h>
    #include <iostream>
    using namespace std;
    
    int main (int argc, char* argv[]) {
      WSADATA wdData;
      if (WSAStartup(MAKEWORD(2, 0), &wdData) == INVALID_SOCKET) {
        cout << "Konnte WinSock nicht initialisieren!" << endl;
        system ("PAUSE");
        return 256;                   
      } else {
        cout << "WinSock initialisiert!" << endl;
      }
    
      SOCKET sckSocket;
      SOCKADDR_IN addrServer;
      char Request[100];
    
      /* SOCKADDR_IN erstellen und Port setzen, auf dem er hört. */
      addrServer.sin_addr.s_addr = INADDR_ANY; // listen on all IPs associated with this computer
      addrServer.sin_port = htons(80); // bind to port 80
      addrServer.sin_family = AF_INET;
    
      if ((sckSocket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
        cout << "Konnte keinen Socket erstellen!" << endl;
        system ("PAUSE");
        return 256;
      } else {
        cout << "Socket erstellt!" << endl;
      }
    
      if (bind(sckSocket, (SOCKADDR *) &addrServer, sizeof(addrServer)) == SOCKET_ERROR) {
        cout << "Konnte nicht an Port binden!" << endl;
        system ("PAUSE");
        return 254;
      } else {
        cout << "An Port gebunden!" << endl;   
      }
    
      if (listen(sckSocket, 4) == SOCKET_ERROR) {
        cout << "Socket kann nicht hören!" << endl;
        system ("PAUSE");
        return 253;
      } else {
        cout << "Socket hört!" << endl;       
      }
    
      while (true) {
        /* Zum Ausgrenzen um die Anzahl und schnelligkeit der Durchläufe zu sehen */
        cout << "---" << endl;
    
        SOCKET sckClient = accept(sckSocket, 0, 0);
        if (sckClient != INVALID_SOCKET) {
          /* Nur 1 Strich und kein 'hier müsste was kommen' Also bleibts bei Accept stehen. */
          cout << "hier müsste was kommen!" << endl;
    
          if (recv(sckClient, Request, sizeof(Request), 0) > 0) {
            cout << Request << endl;
    
            /* Auf Request antworten. */
            char test[] = "hallo zurück";
            send (sckSocket, test, 12, 0);
          }
        }
      }
    
      closesocket (sckSocket);
      system ("PAUSE");
      return 0;
    }
    

    Aba erst wenn ich die Verbindung trenne dann wird erst ausgegeben was der Client Geschickt hat.
    Und dies kann ich dann leider nicht mit einer If-Anweisung Überprüfen



  • dein fehler liegt unter anderem HIER

    if (recv(sckClient, Request, sizeof(Request), 0) > 0) {
            cout << Request << endl;
    
            /* Auf Request antworten. */
            char test[] = "hallo zurück";
            send (sckSocket, test, 12, 0);
          }
    

    nach deinem accept rennst du in das recv, das blockiert bis etwas angekommen ist, danach wird der socket NIE WIEDER gelesen .... irgendwie iss das komisch bei dir .... dein client code wäre auch interessant, weil so sieht das bis auf n konzeptionelles problem so aus als müsste er sofort reagieren wenn ein client sich verbindet

    [EDIT] liess dir bitte die hilfe zu select() durch, das sollte dir in deinem problem helfen



  • Wenn de denn Code vom meinem Client willst der ist in VB geschrieben.



  • ach verdammt stimmt ja .... nja sry da kannsch so auf die schnell nich helfen



  • Wie kann ich den folgende Zeile ändern?
    Weiß net was ich da abändern soll:

    if (recv(sckClient, Request, sizeof(Request), 0) > 0) {
            cout << Request << endl;
    
            /* Auf Request antworten. */
            char test[] = "hallo zurück";
            send (sckSocket, test, 12, 0);
          }
    

Log in to reply