C++ Server/Client - Server empfängt nichts!

Abend, Christen!
Also, ich werde einfach nicht schlau, was da falsch sein könnte.

server.exe
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;
    return 256;                   
  }

  SOCKET sckSocket;
  SOCKADDR_IN addrServer;
  char Request[100];

  addrServer.sin_addr.s_addr = INADDR_ANY; // listen on all IPs associated with this computer
  addrServer.sin_port = htons(8899); // bind to port 8899
  addrServer.sin_family = AF_INET;

  if ((sckSocket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
    return 256;

  if(bind(sckSocket, (SOCKADDR *) &addrServer, sizeof(addrServer)) == SOCKET_ERROR)
    return 254;

  if(listen(sckSocket, 4) == SOCKET_ERROR)
    return 253;

  while (true) {
    SOCKET sckClient = accept(sckSocket, 0, 0);
    if (sckClient != INVALID_SOCKET) {
      if (recv(sckSocket, Request, sizeof(Request), 0) > 0) {
        cout << Request << endl;
        char test[] = "hallo zurück";
        send (sckSocket, test, sizeof(test), 0);
      }
    }
  }

  system ("PAUSE");
  return 0;
}

client.exe
Code:
#include <cstdlib>
#include <iostream>
#include <winsock2.h>
using namespace std;

int main (int argc, char *argv[]) {
  /* Initialisiert Winsock. */
  WSADATA wdData;
  WSAStartup (MAKEWORD(2, 2), &wdData);

  /* Buffer bereitstellen. */
  SOCKET sckSocket;
  SOCKADDR_IN addrServer;
  string Request = "Hallo";
  char Antwort[100];

  /* Socket erstellen. programm beenden, falls nicht möglich. */
  if ((sckSocket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
    cout << "Konnte keinen Socket erstellen!" << endl;
    return 256;
  }
  
  /* Protokoll, Port und Zielserver angeben. */
  addrServer.sin_family = AF_INET;
  addrServer.sin_addr.s_addr = inet_addr("127.0.0.1");
  addrServer.sin_port = htons(8899);
  
  /* Socket zum Zielserver verbinden. Programm beenden, falls was schief ging. */
  if (connect(sckSocket, (SOCKADDR *) &addrServer, sizeof(addrServer)) == SOCKET_ERROR) {
    cout << "Konnte nicht zum Server verbinden!" << endl;

    system ("PAUSE");
    return 254;
  }

  /* Dem Zielserver ein hallo senden. Programm beenden, falls Server nicht empfangen will */
  if (send(sckSocket, Request.c_str(), sizeof(Request), 0) <= 0) {
    cout << "Server empfängt nichts!" << endl;

    system ("PAUSE");
    return 253;
  }

  /* Antwort ausgeben. Programm beenden, falls Server nichts schickt. */
  if (recv(sckSocket, Antwort, sizeof(Antwort), 0) <= 0) {
    cout << "Server antwortet nicht!" << endl;

    system ("PAUSE");
    return 252;
  }

  cout << "Request geschickt" << endl;
  closesocket(sckSocket);

  system ("PAUSE");
  return 0;
}

Ich starte server.exe. Keine Meldungen, ein Blinker.
OK, er läuft die Unendlichschleife...
Nun starte ich client.exe.
Verbunden und block ein Blinker.
Also nehme ich an, dass der client erfolgreich zum server verbudnen ist.
Nun ist in beiden Programmen bloß ein Blinker und das war's.
Sobald ich server.exe schliesse, steht in cleint.exe
"Server antwortet nicht"

Also nehme ich stark an, dass der Client dem Server erfolgreich hallo
zugesendet hat, der server empfängt es aber entweder nicht oder
antwortet nicht.

Der ganze Fehler muss irgendwo hier liegen:
Code:
  while (true) {
    SOCKET sckClient = accept(sckSocket, 0, 0);
    if (sckClient != INVALID_SOCKET) {
      if (recv(sckSocket, Request, sizeof(Request), 0) > 0) {
        cout << Request << endl;
        char test[] = "hallo zurück";
        send (sckSocket, test, sizeof(test), 0);
      }
    }

Das scheint entweder nichts zu empfangen oder
nichts zurückzusenden.

Kann mir jemand helfen, wie das richtig geht?
danke.

/* edit */

Ich habe jetzt den Code zum Bug ausgrenzen folgendermaßen umgeändert:
Code:
  while (true) {
    SOCKET sckClient = accept(sckSocket, 0, 0);
    if (sckClient != INVALID_SOCKET) {
      /* Bug ausgrenzen. */
      cout << "hier müsste was kommen!" << endl;
                  
      if (recv(sckSocket, Request, sizeof(Request), 0) > 0) {
        cout << Request << endl;
        char test[] = "hallo zurück";
        send (sckSocket, test, sizeof(test), 0);
      }
    }
  }

Starte den Server, sehe ich das "hier müsste was kommen!", sobald
ich die client.exe starte. Der Request des Clienten kommt aber nicht rein...

Müsste es wohl am recv liegen.
 
Lange her der Server Kram, aber versuch mal folgendes:

ändere
Code:
string Request = "Hallo";
beim Clienten in:
Code:
char Request[] = "Hallo";

musst halt alle "Request.c_str()" durch einfache "Request" austauschen
 
hat sich rein garnichts geändert und kann mir auch nicht
vorstellen, wieso es das sollte...
Trotzdem danke...

/* edit */

Problem gelöst, daran lag's

Code:
      if (recv(sckSocket, Request, sizeof(Request), 0) > 0) {

korrekt ist

Code:
      if (recv(sckClient, Request, sizeof(Request), 0) > 0) {

Das ist der Socket für den Client-Request, der
andere der eigene Socket im listening Modus.
Danke an alle, die helfen wollten.
 
hallo jesus,

könntest du mir mal den source von deiner server.exe und dem client.exe posten?? also jetzt wo keine fehler mehr drin sind? ich hab auch schon mit sockets rumprobiert aber ich krieg da einfach nichts hin was funzt :(. ich benutze dev c++. muss ich noch irgend was einstellen oder kann ich den source einfach so compilieren?

edit: wenn ich das so compiliere kommen immer ganz viele " Linker error"

mfg, 0ImZ
 
Ich benutze auch den Dev-C++.
Du musst die winsock schon linken!

Projekt -> Prokettoptionen -> Parameter -> Bibliothek/Objekt hinzufügen.
 
ok, dass habe ich jetzt hinbekommen :)

noch ne frage: welche variable enthält den wert, der vom clienten kommt? ist das Request[100] ??
wenn ich ne if abfrage mache z.b. if(Request[100]==3) {cout.....} kommt wenn der client 3 sendet nicht das was ich will! wie kann ich den emfangenen wert weiternutzen?


und noch was: wenn ich z.b. "hallo" sende wird hallo nicht ganz dargestellt. da kommt dann immer nur "hall... und dann so komische zeichen"

und noch was: der server antwortet iwie nicht also das "hallo zurück".

thx 4 help schonmal ;) mfg, 0ImZ
 
OMG nein!!!
In Request speichere ich, was dem Server geschcikt werden soll.

noch ne frage: welche variable enthält den wert, der vom clienten kommt? ist das Request[100] ??

ne, Antwort[100].

und noch was: wenn ich z.b. "hallo" sende wird hallo nicht ganz dargestellt. da kommt dann immer nur "hall... und dann so komische zeichen"

und noch was: der server antwortet iwie nicht also das "hallo zurück".

Das würde vll daran liegen, dass bei dir Port 9988 nciht offen ist.
Versuch's mal mit Port 80, sowohl listen vom Server als auch
vom Clienten.

/* edit */
Jetzt musst ich 3mal editieren, weil ich QUOTE falsch geschrieben habe.
Könnter den QUOTE-Button nicht umbauen, dass kein Prompt für
den zu zitierenden Text mehr kommt und einfach um das Markierte
herum QUOTE und /QUOTE steht?
Versucht's mal mit RegExp.
Hackerboard lol
 
Vorweg: Ich progge mit 0lmz zusammen...

Wir wollen den Server anhand der empfangenen Nachricht best. Funktionen ausführen lassen, das wollten wir mit ner IF-Abfrage realisieren, aber wenn wir
Code:
if(Request[100]==3){cout...}
einfügen, dann wird nichts ausgegeben.
Wir haben versucht, den Bereich einzugrenzen, aber da kamen ganz komische Werte raus...
Unser Source soll dann ungefähr so aussehen:

...
[der ganze socket-dreck]
request wird definiert
request wird ausgegeben
if request=== 3
bool blabla
else if request==4
bool blabla
...

Anschließend muss ich noch sagen, dass wir beide nicht besondere Pros sind ^^
 
Wir wollen den Server anhand der empfangenen Nachricht best. Funktionen ausführen lassen, das wollten wir mit ner IF-Abfrage realisieren, aber wenn wir

Klingt, als ob ihr erstmal die grundlagen mal lesen müsstet.
LOL, if's werden überall benötigt für alles, ohne if geht
rein garnichts.

if(Request[100]==3){cout...}

Vorallem das ist lustig. Wahrscheinlich dachtet ihr das
Request[100] der Variablename ist. Request ist
der Variablename, die [100] ist der Blockoperator
dahinter, die die Variable zunem Array für 100
dieses Datentypes sind.

Jeder Array-Eintarg ist ein Buchstabe, so funktionieren die
strings in C++ (Das string-Objekt mal ausgenommen)

[der ganze socket-dreck]
request wird definiert
request wird ausgegeben
if request=== 3
bool blabla
else if request==4
bool blabla

Das ganze Skript ist der socket-"Dreck"
 
jo^^ sind halt noch noobs^^ aber jetzt funzt das ja :)

2 sachen noch: warum kann der server nicht antworten? an ner firewall etc kanns nicht liegen.

und warum kann die nachricht die dem server geschickt wird nicht länger als 4 zeichen sein? wenn es mehr sind, dann kommt so en bug.

mfg, 0ImZ
 
Der Server verarbeitet den Request in meinem beispiel doch übrhaupt nicht.
Er schcikt bloß was zurück, wenn er was empfängt, ganz egal was.
Weiß bei deinem problem also nicht weiter.
 
mmh ok. wie könnte ich es denn machen, dass der server regelmäßig anfragen an meine ip schickt wenn er an ist? wenn ich so wie das script jetzt ist zum server connecten will muss ja der port weitergeleitet werden und das ist ja blöd...

also ich möchte den server so, dass er ne verbindung zum clienten herstellt und dann auf anweisungen wartet. (sonst muss ja jeder [es soll mal ein chatprog werden] einstellungen am router machen und das ist ja blöd)

mfg, 0ImZ
 
Original von olmz
mmh ok. wie könnte ich es denn machen, dass der server regelmäßig anfragen an meine ip schickt wenn er an ist? wenn ich so wie das script jetzt ist zum server connecten will muss ja der port weitergeleitet werden und das ist ja blöd...

Hab ich irgendwie eine Definition falsch verstanden? Im Normalfall sendet der Client die Anfragen und der Server beantwortet sie. Wenn also dein "Server" anfragen an deinen "Client" schicken soll, so ist dein Client der Server und der Server der Client.
 
lol jesus^^ das will ich jetzt einfach mal überhören.

@bitmuncher: ja, aber bei dem script von jesus kommt leider keine antwort mehr vom server zurück :( genau das funzt ja nicht :(
der server sendet nur, bekommt aber keine bestätigung

mfg, 0ImZ
 
Zurück
Oben