Problem mit Server und Client



  • Hallo Member!

    Ich habe mir heute einen Server und den dazugehörigen Client zusammen gebastelt. Ein par Tutorials haben mir dabei geholfen, deswegen sind manche Benennungen auf Deutsch, andere in Englisch.

    Ich habe aber ein kleines Problem: Ich möchte, dass der Server empfangen und senden kann (also Daten senden) und ich möchte, dass der Client das selbe kann. Aber ich bekomm das einfach nicht hin! es wäre nett, wenn mir da jemand von euch helfen kann!

    Vielen Dank im Vorraus

    Hier mal der Code vom Server:

    #include <windows.h>
    #include <winsock.h>
    #include <stdio.h>
    
    #define NETWORK_ERROR -1
    #define NETWORK_OK     0
    
    void ReportError(int, const char*);
    
    int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow)
    {
    
      WORD sockVersion;
      WSADATA wsaData;
      int nret;
    
      sockVersion = MAKEWORD(1, 1);
    
      WSAStartup(sockVersion, &wsaData);
      SOCKET listeningSocket;
    
      listeningSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    
      if(listeningSocket == INVALID_SOCKET)
      {
      nret = WSAGetLastError();
      ReportError(nret, "socket()");
    
      WSACleanup();
      return NETWORK_ERROR;
      }
    
      SOCKADDR_IN serverInfo;
      serverInfo.sin_family = AF_INET;
      serverInfo.sin_addr.s_addr = INADDR_ANY;
      serverInfo.sin_port = htons(8888);
    
      nret = bind(listeningSocket, (LPSOCKADDR)&serverInfo, sizeof(struct sockaddr));
    
      if(nret == SOCKET_ERROR) 
      {
      nret = WSAGetLastError();
      ReportError(nret, "bind()");
    
      WSACleanup();
      return NETWORK_ERROR;
      }
    
      nret = listen(listeningSocket, 10);
    
      if (nret == SOCKET_ERROR)
      {
    
      nret = WSAGetLastError();
      ReportError(nret, "listen()");
    
      WSACleanup();
      return NETWORK_ERROR;
      }
    
             SOCKET theClient;
    
      theClient = accept(listeningSocket, NULL, NULL);
    
      if (theClient == INVALID_SOCKET)
      {
    
      nret = WSAGetLastError();
      ReportError(nret, "accept()");
      WSACleanup();
      return NETWORK_ERROR;
      }
    
      else
     {
     printf("Connection accepted\n\n");
     int willkommen();
     system("PAUSE");
     }
    
      closesocket(theClient);
      closesocket(listeningSocket);
    
      WSACleanup();
      return NETWORK_OK;
      }
    
      int willkommen(int s)
      {
    
      int bytes;
      char buffer[] = "Willkommen auf dem Server!\r\n";
      bytes = send(s, buffer, strlen(buffer), 0);
      if (bytes == 1)
        {
          printf("send() failed!");
          return -1;
          }
    
      }  
    
      void ReportError(int errorCode, const char *whichFunc)
      {
      char errorMsg[92];
      ZeroMemory(errorMsg, 92);
    
      sprintf(errorMsg, "Call to %s returned error %d", (char *)whichFunc, errorCode);
      MessageBox(NULL, errorMsg, "socketIndication", MB_OK);
      }
    

    Und hier mal der Client:

    #include <windows.h>
    #include <winsock.h>
    #include <stdio.h>
    
    #define NETWORK_ERROR -1
    #define NETWORK_OK     0
    #define BUFFER_SIZE 1024
    
    void ReportError(int, const char *);
    
    int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow)
    {
    
    WORD sockVersion;
    WSADATA wsaData;
    int nret;
    
    sockVersion = MAKEWORD(1, 1);
    WSAStartup(sockVersion, &wsaData);
    
    LPHOSTENT hostEntry;
    in_addr iaHost;
    iaHost.s_addr = inet_addr("127.0.0.1");
    hostEntry = gethostbyaddr((const char *)&iaHost, sizeof(struct in_addr), AF_INET);
    
    if(!hostEntry)
    {
    
    nret = WSAGetLastError();
    ReportError(nret, "gethostbyaddr()");
    
    WSACleanup();
    return NETWORK_ERROR;
    
    }
    
    SOCKET theSocket;
    theSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    
    if(theSocket == INVALID_SOCKET)
    {
    
    nret = WSAGetLastError();
    ReportError(nret, "socket()");
    WSACleanup();
    return NETWORK_ERROR;
    }
    
    SOCKADDR_IN serverInfo;
    
    serverInfo.sin_family = AF_INET;
    
    serverInfo.sin_addr = *((LPIN_ADDR)*hostEntry->h_addr_list);
    serverInfo.sin_port = htons(8888);
    
    nret = connect (theSocket, (LPSOCKADDR)&serverInfo, sizeof(struct sockaddr));
    
    if (nret == SOCKET_ERROR)
    {
    nret = WSAGetLastError();
    ReportError(nret, "connect()");
    
    WSACleanup();
    return NETWORK_ERROR;
    }
    
    else
     {
     printf("Successfully connected.\n\n");
     int empfangen();
    
     }
    
    closesocket(theSocket);
    WSACleanup();
    return NETWORK_OK;
    }
    
    int empfangen(int s)
    {
    
      char buffer[BUFFER_SIZE];
      int bytes;
    
      bytes = recv(s, buffer, sizeof(buffer) -1, 0);
    
      if (bytes == 1)
        {
    
          printf("recv() failed!");
          return -1;
    
    buffer[bytes] = '\0';
    printf("Server: %s", buffer);
    
    }
    
    return 0;
    
    }    
    
    void ReportError(int errorCode, const char *whichFunc)
    {
    char errorMsg[92];
    
    ZeroMemory(errorMsg, 92);
    
    sprintf(errorMsg, "Call to %s returned error %d!", (char *)whichFunc, errorCode);
    
    MessageBox(NULL, errorMsg, "socketIndication", MB_OK);
    
    }
    


  • Ich würde dir raten ein Tutorial über die _Grundlagen_ zu lesen. Und erst wenn du die Grundlagen beherrscht, dich mit Socketprogrammierung zu beschäftigen.

    Und bedenke: Copy&Paste bringt dich nicht weiter



  • also ich habe mir das ganze nicht einfach rauskopiert, sondern ich ahbe mir die tutorials angeschaut und das teil dann geschrieben - und nicht copy and paste verwendet.
    und..
    1. ich habe mir ein par tutorials zum thema angeschaut und kann bererits ein bisschen was
    und
    2. kein copy and paste.....

    und
    3. bringt mich deine antwort auch nicht viel weiter.

    Ich programmiere schon länger in C++ und weiß schon, dass mich copy und paste nicht weiterbringt, dass brauchst du einem erfahrenen php programmierer nicht mehr zu sagen.



  • Abgesehen davon gehört das nach WinAPI



  • sorry, hab ich verplant!



  • Dieser Thread wurde von Moderator/in flenders aus dem Forum Webzeugs in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • gutu tut's für deine sammlung
    http://www.c-worker.ch/

    funktionen ruft man ohne rückgabewerte auf.

    cf.ru schrieb:

    willkommen();
    

    parameter ?

    cf.ru schrieb:

    empfangen();
    

    parameter ?



  • Was fällt denn dann noch sofort bei betrachten der Funktion "empfangen()" auf?

    int empfangen(int s) 
    { 
        char buffer[BUFFER_SIZE]; 
        int bytes; 
        bytes = recv(s, buffer, sizeof(buffer) -1, 0); 
        if (bytes == 1) 
        { 
            printf("recv() failed!"); 
            return -1; 
            buffer[bytes] = '\0'; 
            printf("Server: %s", buffer); 
        } 
        return 0; 
    }
    


  • Hepi schrieb:

    Was fällt denn dann noch sofort bei betrachten der Funktion "empfangen()" auf?

    ich weis es, ich weis es *freuwiekleineskind* 🤡

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

    so siehst es schon besser aus

    bytes = recv(s, buffer, sizeof(buffer), 0);
        if(bytes == 0)
        {
          printf("Server hat die Verbindung getrennt..\n");
          return -1; 
        }
        if(bytes == SOCKET_ERROR)
        {
          printf("Fehler: recv, fehler code: %d\n",WSAGetLastError());
          return -1; 
        }
        buffer[bytes]='\0';
        printf("\nServer antwortet: %s\n",buffer);
    


  • ahhh, vielen dank für eure antworten! werde gleich mal versuchen, dass bei mir zum laufen zu bekommen!



  • geht doch nicht! habe es ausprobiert und es läuft nicht 😞



  • was geht nicht ? wo hängt es ? rückgabewerte ? getlasterror ?



  • gibt es überhaupt eine verbindung???

    und gib mal in willkommen() als parameter den listeningSocket ein

    und bei empfangen() als parameter theSocket


Anmelden zum Antworten