Problem mit Client/Server...
-
Möchte gern ein Client/Server erstellen bei dem der client befehle an den server schickt. Die Befehle werden per Eingabe übermittelt. Mein Problem ist folgender:
sobald ich den ersten string übergebe kommt er auch beim server an, doch ab dem zweiten kommt nichts mehr an. Es kommt fogender fehler vom client:send() hat eine unterschiedliche Anzahl von Bytes versendet, als erwartet !!!!:SERVER
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <errno.h> #include <time.h> #include <winsock.h> #include <io.h> #pragma comment(lib, "wsock32.lib") /* Puffer für eingehende Nachrichten */ #define RCVBUFSIZE 1024 static void echo(SOCKET); static void error_exit(char *errorMessage); /* Funktion gibt Daten vom Client auf dem stdout aus, * welche dieser mit der Kommandozeile übergibt */ static void echo(SOCKET client_socket) { char echo_buffer[RCVBUFSIZE]; int recv_size; time_t zeit; if((recv_size = recv(client_socket, echo_buffer, RCVBUFSIZE,0)) < 0) error_exit("Fehler bei recv()"); echo_buffer[recv_size] = '\0'; time(&zeit); printf("Nachrichten vom Client : %s \t%s", echo_buffer, ctime(&zeit)); } /* Funktion gibt aufgetrenene Fehler aus und * beendet die Anwendung */ static void error_exit(char *error_message) { fprintf(stderr,"%s: %d\n", error_message, WSAGetLastError()); exit(EXIT_FAILURE); } int main( int argc, char* argv[]) { if(argc > 1) { int PORT = atoi(argv[1]); struct sockaddr_in server, client; SOCKET sock, fd; int len; /* Initialisiere TCP für Windows ("winsock") */ WORD wVersionRequested; WSADATA wsaData; wVersionRequested = MAKEWORD (1, 1); if (WSAStartup (wVersionRequested, &wsaData) != 0) error_exit( "Fehler beim Initialisieren von Winsock"); /* Erzeuge das Socket */ sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if (sock < 0) error_exit("Fehler beim Anlegen eines Socket"); /* Erzeuge die Socketadresse des Servers */ memset( &server, 0, sizeof (server)); /* IPv4-Verbindung */ server.sin_family = AF_INET; /* INADDR_ANY Jede IP-Adresse annehmen */ server.sin_addr.s_addr = htonl(INADDR_ANY); /* Portnummer */ server.sin_port = htons(PORT); /* Erzeuge die Bindung an die Serveradresse * (genauer an einen bestimmten Port) */ if(bind(sock,(struct sockaddr*)&server, sizeof( server)) < 0) error_exit("Kann das Socket nicht \"binden\""); /* Teile dem Socket mit, dass Verbindungswünsche * von Clients entgegengenommen werden */ if(listen(sock, 5) == -1 ) error_exit("Fehler bei listen"); printf("Server bereit - wartet auf Anfragen ...\n"); /* Bearbeite die Verbindungswünsche von Clients * in einer Endlosschleife * Der Aufruf von accept() blockiert solange, * bis ein Client Verbindung aufnimmt */ for (;;) { len = sizeof(client); fd = accept(sock, (struct sockaddr*)&client, &len); if (fd < 0) error_exit("Fehler bei accept"); printf("Bearbeite Client mit der Adresse: %s\n", inet_ntoa(client.sin_addr)); /* Daten vom Client auf dem Bildschirm ausgeben */ echo( fd ); /* Schließe die Verbindung */ closesocket(fd); } } else { printf("Verwendung: server PORT\n"); } return EXIT_SUCCESS; }CLIENT
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <winsock.h> #include <io.h> #include <string> #include <iostream> #include <vector> #include <sstream> #include <cstdio> #pragma comment(lib, "wsock32.lib") using namespace std; #define RCVBUFSIZE 1024 /* Funktion gibt aufgetrenene Fehler aus und * beendet die Anwendung */ static void error_exit(char *errorMessage) { fprintf(stderr,"%s: %d\n", errorMessage, WSAGetLastError()); } void socket() { /* Initialisiere TCP für Windows ("winsock") */ WORD wVersionRequested; WSADATA wsaData; wVersionRequested = MAKEWORD (1, 1); if (WSAStartup (wVersionRequested, &wsaData) != 0) { error_exit( "Fehler beim Initialisieren von Winsock"); } else { printf("Winsock initialisiert\n"); } } int main( int argc, char* argv[]) { if(argc > 2) { int PORT = atoi(argv[2]); struct sockaddr_in server; struct hostent *host_info; unsigned long addr; SOCKET sock; char *echo_string; int echo_len; socket(); /* Erzeuge das Socket */ sock = socket( AF_INET, SOCK_STREAM, 0 ); if (sock < 0) error_exit( "Fehler beim Anlegen eines Sockets"); /* Erzeuge die Socketadresse des Servers * Sie besteht aus Typ, IP-Adresse und Portnummer */ memset( &server, 0, sizeof (server)); if ((addr = inet_addr( argv[1])) != INADDR_NONE) { /* argv[1] ist eine numerische IP-Adresse */ memcpy( (char *)&server.sin_addr, &addr, sizeof(addr)); } else { /* Für den Fall der Fälle: Wandle den * Servernamen bspw. "localhost" in eine IP-Adresse um */ host_info = gethostbyname(argv[1]); if (NULL == host_info) error_exit("Unbekannter Server"); /* Server-IP-Adresse */ memcpy( (char *)&server.sin_addr, host_info->h_addr, host_info->h_length ); } /* IPv4-Verbindung */ server.sin_family = AF_INET; /* Portnummer */ server.sin_port = htons( PORT ); /* Baue die Verbindung zum Server auf */ if(connect(sock,(struct sockaddr*)&server,sizeof(server)) <0) { error_exit("Kann keine Verbindung zum " "Server herstellen"); } else { cout << "Connected" << endl; } string command; //Eingabe String //Ab hier soll die eingabe starten! do { cout << ">>"; //Befehl mit Parameter einlesen getline(cin, command); istringstream cmdline (command); string input; vector<string> params; if (cmdline >> input) { string tmp; while (cmdline >> tmp) { params.push_back (tmp); } //Ausführung mit Parameter if(params.size() >= 1) { string cmd; for(int i=0; i <= params.size()-1; i++) { cmd += params[i] + " "; } cout << "Mit Parameter: "; cout << cmd << endl; } echo_len = strlen(command.c_str()); /* Zweites Argument wird als "echo" beim Server verwendet */ //echo_string = argv[3]; /* Länge der Eingabe */ //echo_len = strlen(echo_string); /* Denn String inskl. Nullterminator an den Server senden */ // if (send(sock, echo_string, echo_len, 0) != echo_len) if (send(sock, command.c_str(), echo_len, 0) != echo_len) { error_exit("send() hat eine unterschiedliche Anzahl" " von Bytes versendet, als erwartet !!!!"); } /* Schließe Verbindung und Socket */ closesocket(sock); /* Cleanup Winsock */ WSACleanup(); } command.erase(command.begin(),command.end());//Löscht den Input Inhalt }while(1); } else { printf("Verwendung: client SERVER PORT\n"); } return EXIT_SUCCESS; }
-
Und welchen Wert gibt send zurück?
-
Der wert lautet: 10093
-
kernel64 schrieb:
Der wert lautet: 10093
Das sieht mir eher nach dem Rückgaberwert von WSAGetLastError() aus. Und dieser Wert ist nur aussagekräftig wenn send mit SOCKET_ERROR fehlgeschlagen ist.
-
was soll nun machen damit ich dem server ganze zeit befehle(strings) senden kann ohen das der client abbricht?
-
Wie es aussieht will mir niemand helfen

Also mein Client soll sobald er mit dem server verbunden ist, eine art eingabe prompt starten bei der man befehle(strings) an den server senden kann. Beim server werden diese verglichen wie z.b. "shutdown" dann fährt der server den PC herunter.Sobald ich den ersten string eingebe und sende kommt dieser an, aber ab dem zweiten string kommt keiner mehr an, siehe oben.
bitte um hilfe!!
-
Verbindest du übers Internet oder über LAN bzw deinen eigenen Computer?
Mfg Ominion
[EDIT]Setze mal den Buffer der die Nachricht aufnimmt auf NULL wbevor du was empfängst. Falls du den alten Wert noch brauchst mach einen Buffer in den die gerade empfangenen Daten reinkommen und einen in den die alten reinkommen.[/EDIT]
-
Ja verbinde den client/server an meinem rechener.
Meinste den Buffer vom Server? Ich glaub der fehler liegt am client.
-
So wie ich das sehe, ruft der server nur einmal pro verbindung echo() auf und damit auch nur einmal recv(). Danach trennt der Server die Verbindung.
Somit kann auch nur eine Nachricht empfangen werden.Du solltest also am besten echo() in ner Schleife aufrufen und in echo zurückgeben, ob bei recv() ein Fehler aufgetreten ist (wenn ja, dann wurde warscheinlich die verbindung getrennt, der Server kann dann die nächste bearbeiten).
Pseudo-Code:
int main() { for (;;) { len = sizeof(client); fd = accept(sock, (struct sockaddr*)&client, &len); if (fd < 0) error_exit("Fehler bei accept"); /* Daten vom Client auf dem Bildschirm ausgeben */ while(echo( fd )); /* Schließe die Verbindung */ closesocket(fd); } } static bool echo(SOCKET client_socket) { char echo_buffer[RCVBUFSIZE]; int recv_size; if((recv_size = recv(client_socket, echo_buffer, RCVBUFSIZE,0)) < 0) return false; echo_buffer[recv_size] = '\0'; printf("Nachrichten vom Client : %s", echo_buffer); return true; }