Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
Code Kitchen Allgemeines Coder-Forum rund um das Programmieren eigenständiger, ausführbarer Programme.

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

Diskussion: C++ Server/Client - Server empfängt nichts! im Forum Code Kitchen, in der Kategorie Software Home; Anzeige Abend, Christen! Also, ich werde einfach nicht schlau, was da falsch sein könnte. server.exe Code: #include <winsock2.h> #include <iostream> ...

Antwort
Alt 23.01.07, 18:00   #1 (permalink)
 
Registriert seit: 08.12.06
jesus Leistung: Facit NTK
Likes: 0
Standard C++ Server/Client - Server empfängt nichts!

Anzeige

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.
jesus ist offline   Mit Zitat antworten
Alt 23.01.07, 18:34   #2 (permalink)
 
Benutzerbild von Avenger
 
Registriert seit: 27.12.03
Avenger Leistung: Facit NTK
Avenger eine Nachricht über ICQ schicken
Likes: 0
Standard

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
Avenger ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 23.01.07, 18:46   #3 (permalink)
Themenstarter
 
Registriert seit: 08.12.06
jesus Leistung: Facit NTK
Likes: 0
Standard

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.
jesus ist offline   Mit Zitat antworten
Alt 24.01.07, 16:41   #4 (permalink)
 
Registriert seit: 30.12.04
olmz Leistung: Facit NTK
olmz eine Nachricht über ICQ schicken
Likes: 0
Standard

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
olmz ist offline   Mit Zitat antworten
Alt 24.01.07, 18:03   #5 (permalink)
Themenstarter
 
Registriert seit: 08.12.06
jesus Leistung: Facit NTK
Likes: 0
Standard

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

Projekt -> Prokettoptionen -> Parameter -> Bibliothek/Objekt hinzufügen.
jesus ist offline   Mit Zitat antworten
Alt 24.01.07, 18:26   #6 (permalink)
 
Registriert seit: 30.12.04
olmz Leistung: Facit NTK
olmz eine Nachricht über ICQ schicken
Likes: 0
Standard

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
olmz ist offline   Mit Zitat antworten
Alt 24.01.07, 20:02   #7 (permalink)
Themenstarter
 
Registriert seit: 08.12.06
jesus Leistung: Facit NTK
Likes: 0
Standard

OMG nein!!!
In Request speichere ich, was dem Server geschcikt werden soll.

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

Zitat:
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
jesus ist offline   Mit Zitat antworten
Alt 24.01.07, 21:25   #8 (permalink)
 
Registriert seit: 24.01.07
sepplb Leistung: Facit NTK
Likes: 0
Standard

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 ^^
sepplb ist offline   Mit Zitat antworten
Alt 25.01.07, 13:16   #9 (permalink)
 
Benutzerbild von Avenger
 
Registriert seit: 27.12.03
Avenger Leistung: Facit NTK
Avenger eine Nachricht über ICQ schicken
Likes: 0
Standard

Zitat:
Original von sepplb
Code:
if(Request[100]==3){cout...}
somit Überprüfst du nur, ob das 100. Elemt von Request gleich dem int 3 is. Probiers mal so:

Code:
#include <cstring>
if( strcmp(Request,"3") == 0 ) { ... }
Avenger ist offline   Mit Zitat antworten
Alt 25.01.07, 14:31   #10 (permalink)
 
Registriert seit: 30.12.04
olmz Leistung: Facit NTK
olmz eine Nachricht über ICQ schicken
Likes: 0
Standard

jo cool das geht thx
olmz ist offline   Mit Zitat antworten
Alt 25.01.07, 14:41   #11 (permalink)
Themenstarter
 
Registriert seit: 08.12.06
jesus Leistung: Facit NTK
Likes: 0
Standard

Zitat:
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.

Zitat:
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)

Zitat:
[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"
jesus ist offline   Mit Zitat antworten
Alt 25.01.07, 16:20   #12 (permalink)
 
Registriert seit: 30.12.04
olmz Leistung: Facit NTK
olmz eine Nachricht über ICQ schicken
Likes: 0
Standard

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
olmz ist offline   Mit Zitat antworten
Alt 25.01.07, 16:31   #13 (permalink)
Themenstarter
 
Registriert seit: 08.12.06
jesus Leistung: Facit NTK
Likes: 0
Standard

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.
jesus ist offline   Mit Zitat antworten
Alt 25.01.07, 19:50   #14 (permalink)
 
Registriert seit: 30.12.04
olmz Leistung: Facit NTK
olmz eine Nachricht über ICQ schicken
Likes: 0
Standard

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
olmz ist offline   Mit Zitat antworten
Alt 25.01.07, 19:56   #15 (permalink)
Moderator
 
Benutzerbild von bitmuncher
 
Registriert seit: 30.09.06
bitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcore
Likes: 441
Standard

Zitat:
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.
__________________
Mein Blog - Mein Job - Diaspora

Der Ring uns zu knechten besteht aus 12 Sternen auf blauem Grund.

Neue Beiträge im Habo via Twitter - Das HaBo auf FB - Das HaBo bei G+
bitmuncher ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » C++ Server/Client - Server empfängt nichts!
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
win ce 5.0 Server,Client Metathron Code Kitchen 0 11.11.09 08:48
VPN Client Server Lösungen mauralix Network · LAN, WAN, Firewalls 6 29.12.06 02:08
c++ client-server verbindung redips Applikationen 11 19.12.05 16:28
ein IRC Client & 2 Server?? Watchme Internet Allgemein 1 24.08.02 11:10
Client/Server Projekt Armitage Code Kitchen 7 17.03.02 19:10


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61