C++ Server soll vom Clienten erhaltene Daten auswerten

Übersicht Sonstiges Smalltalk

Neue Antwort erstellen

Alkan

Betreff: C++ Server soll vom Clienten erhaltene Daten auswerten

BeitragMi, Nov 17, 2010 22:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
für die Schule(besser gesagt Mathe/Info) sollten wir ein kleines Schiffe versenken in Excel programmieren.
Da ich VB.net kann und man ja in Excel Makros mit VBA(Visual Basic for Applications) programmieren kann hab ich mir gedacht ich nutze das aus um eine bessere Note zu bekommen.
Später ist mir noch ne Idee gekommen, dass Projekt zu einen Online-Multiplayer-Spiel zu machen.
Lange Rede kurzer Sinn...mein Client(Excel) sendet ja Daten an den Server(in C++ geschrieben), diese kommen auch richtig an(hab ich nachgeprüft) doch wenn ich im Server eine IF-Bedingung mache, die falls z.B "/reg_name" ankommt eben z.B zuerst Nachprüft ob es den Spieler schon gibt und falls es ihn nicht gibt diesen Registriert.
Aber er springt gar nicht in die IF-Bedingung rein, als ob der Wert mit dem abgefragtem Wert nicht übereinstimmt(aber das tut es eigentlich) .
Hier der Code für meinen Server(C++):
Code: [AUSKLAPPEN]

#pragma comment( lib, "ws2_32.lib" )

#include <winsock2.h> // bei manchan compilern muss man nur windows.h includieren (zB VC++)
#include <windows.h>
#include <stdio.h>
#include <string.h>


#define MAX_CLIENTS 32

int startWinsock(void)
{
  WSADATA wsa;
  return WSAStartup(MAKEWORD(2,0),&wsa);
}

int main()
{
  FILE * pFile;
  pFile = fopen("user.txt","r+");
  char user[100];
  long rc;
  SOCKET acceptSocket;
  //SOCKET connectedSocket;
  SOCKADDR_IN addr;
  SOCKADDR_IN ClientAddr;
  char buf[256];
  char buf2[300];
  // zusätzliche Variabeln
  FD_SET fdSet;
  SOCKET clients[MAX_CLIENTS];
  int i;

  // Winsock starten
  rc=startWinsock();
  if(rc!=0)
  {
    printf("Fehler: startWinsock, fehler code: %d\n",rc);
    return 1;
  }
  else
  {
    printf("Winsock gestartet!\n");
  }

  // Socket erstellen
  acceptSocket=socket(AF_INET,SOCK_STREAM,0);
  if(acceptSocket==INVALID_SOCKET)
  {
    printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError());
    return 1;
  }
  else
  {
    printf("Socket erstellt!\n");
  }

  // Socket binden
  memset(&addr,0,sizeof(SOCKADDR_IN));
  addr.sin_family=AF_INET;
  addr.sin_port=htons(12345);
  addr.sin_addr.s_addr=INADDR_ANY; // gewisse compiler brauchen hier ADDR_ANY
  rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));
  if(rc==SOCKET_ERROR)
  {
    printf("Fehler: bind, fehler code: %d\n",WSAGetLastError());
    return 1;
  }
  else
  {
    printf("Socket an port 12345 gebunden\n");
  }

  // In den listen Modus
  rc=listen(acceptSocket,10);
  if(rc==SOCKET_ERROR)
  {
    printf("Fehler: listen, fehler code: %d\n",WSAGetLastError());
    return 1;
  }
  else
  {
    printf("acceptSocket 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)) {
      // einen freien platz für den neuen client suchen, und die verbingung annehmen
      for(i=0;i<MAX_CLIENTS;i++)
      {
        if(clients[i]==INVALID_SOCKET)
        {
          clients[i]=accept(acceptSocket, (LPSOCKADDR)&ClientAddr,NULL);
          printf("Neuen Client angenommen (%d) IP: %e \n",i, inet_ntoa(ClientAddr.sin_addr));
          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);
        // prüfen ob die verbindung geschlossen wurde oder ein fehler auftrat
        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
        {
         if(buf=="/name")
            printf("abc");
          buf[rc]='\0';
          // daten ausgeben und eine antwort senden   
        printf("Client %d hat folgendes gesendet: %s\n",i,buf);
        fputs(buf, pFile);
        fputs("|", pFile);
        fflush(pFile);

          // antwort senden
          sprintf(buf2,"Du mich auch %s\n",buf);
          send(clients[i],buf2,(int)strlen(buf2),0);
      }
     }
   }
  }
   fclose(pFile);
  WSACleanup();
}


Leider finde ich den Fehler nicht hoffe ihr könnt ihn finden Wink

MfG
Alkan
Hauptrechner: Win7 Ultimate x64|AMD Phenom II X4 965 BlackEdition 4x3.4GHz|4 GB DualKit DDR3-1600 Ram|1.5 TB Samsung EcoGreen|Cougar CM 700Watt|ASRock M3A790GFX/120M|Nvidia GeForce 9500GT|Ati Radeon HD3300(Onboard-Deaktiviert)
Server(früher Hauptrechner): Ubuntu 9.1 x86|Intel P4 HT 3GHz|Ati Radeon X600Pro|200 GB HDD
Worklog: Planetensimulation
Homepage(Under Construction): alkan96.dyndns.org
Wenn schon falsch, dann richtig falsch.

Jolinah

BeitragDo, Nov 18, 2010 21:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

hast du mal einen Haltepunkt bei dem if gesetzt und den Debugger laufen lassen? Ich vermute dass da eben nicht "/reg_name" daher kommt, sondern evtl. nur ein Zeichen wie z.B. '/', beim nächsten Durchgang dann 'r' usw... Generell kann man beim Lesen von Sockets nie davon ausgehen (ausser vielleicht bei UDP), dass man nach einem recv genau die Daten hat die man wollte, da ja recv einen int zurückgibt in dem steht wie viele Bytes gelesen wurden.

Die Lösung wäre dann alles was man liest in einen Buffer zu schreiben, und erst wenn ein Zeilenumbruch oder eine '\0' ankommt dann eine Zeile / ein String aus diesem Buffer auszulesen und den Wert auch erst dann zu prüfen.

Und falls nicht: Der Debugger hilft meistens enorm bei solchen Fehlern. Ausser bei Multithreading, da kann es schwieriger werden Wink

Alkan

BeitragDo, Nov 18, 2010 22:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja das habe ich schon gemacht.
Nach "recv" wurde die Variable "buf" mit dem Wert "/reg_name" geladen,
doch trotzdem springt er nicht in die IF-Bedingung rein.
Hauptrechner: Win7 Ultimate x64|AMD Phenom II X4 965 BlackEdition 4x3.4GHz|4 GB DualKit DDR3-1600 Ram|1.5 TB Samsung EcoGreen|Cougar CM 700Watt|ASRock M3A790GFX/120M|Nvidia GeForce 9500GT|Ati Radeon HD3300(Onboard-Deaktiviert)
Server(früher Hauptrechner): Ubuntu 9.1 x86|Intel P4 HT 3GHz|Ati Radeon X600Pro|200 GB HDD
Worklog: Planetensimulation
Homepage(Under Construction): alkan96.dyndns.org
Wenn schon falsch, dann richtig falsch.

Jolinah

BeitragDo, Nov 18, 2010 23:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Was ich noch gesehen habe ist, dass du die Strings mit == vergleichst. Bin mir nicht mehr sicher ob das so geht in C/C++. Evtl. musst du stattdessen folgendes verwenden:

Code: [AUSKLAPPEN]

if (strcmp(buf, "/reg_name") == 0) {
    // dann sind sie identisch
}


strcmp ist Case Sensitive, falls die Gross-/Kleinschreibung keine Rolle spielt kannst du stricmp verwenden.

Hoffe das hilft Wink

Alkan

BeitragFr, Nov 19, 2010 18:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja das hatte ich eigentlich auch als erstes, hat aber auch nicht funktioniert und deshalb hab
ich das durch == ersetzt in der Hoffnung das es dann klappt, hat es aber nicht.
Hauptrechner: Win7 Ultimate x64|AMD Phenom II X4 965 BlackEdition 4x3.4GHz|4 GB DualKit DDR3-1600 Ram|1.5 TB Samsung EcoGreen|Cougar CM 700Watt|ASRock M3A790GFX/120M|Nvidia GeForce 9500GT|Ati Radeon HD3300(Onboard-Deaktiviert)
Server(früher Hauptrechner): Ubuntu 9.1 x86|Intel P4 HT 3GHz|Ati Radeon X600Pro|200 GB HDD
Worklog: Planetensimulation
Homepage(Under Construction): alkan96.dyndns.org
Wenn schon falsch, dann richtig falsch.

Neue Antwort erstellen


Übersicht Sonstiges Smalltalk

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group