C++ Server soll vom Clienten erhaltene Daten auswerten
Übersicht

![]() |
AlkanBetreff: C++ Server soll vom Clienten erhaltene Daten auswerten |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
![]() |
Alkan |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
![]() |
Alkan |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group