Hallo, habe ein Problem mit dem versenden von Strings unter C. Ich möchte einen belibiegen String eingeben und diesen per TCP/IP versenden. Zielipadresse und Portnummer sind mir bekannt. Den Socket bekomme ich auch noch Fehlerferei installiert, aber dann komme ich mit dem senden nicht mehr klar. Kann mir da jamenden einen einfachen Quellcode nennen ?? Danke
wenn du schon soweit bist, warum rufst du nicht einfach "send" mit den passenden Parameter auf?
wie weit klappt es denn nun? Für die Serverseite braucht man socket(), bind(), listen(), ggf. select(), send()/recv(). Auf der Clientseite ist nötig: socket(), connect(), send()/recv(). Um Beispielcode zu bekommen, wäre es nützlich zu verraten, auf welchem System du unterwegs bist.
Hallo, ich möchte es universell halten Unix WIN32 Die Server Seite funktioniert, nur auf meiner Client seite mit dem Send happert es ein wenig. kann ich nicht es einfach so machen: string text = "Hallo heute ist ein schöner Tag"; test_len = strlen(text); send(sock, text, test_len, 0); #ifdef _WIN32 closesocket(sock); /* Cleanup Winsock */ WSACleanup(); #else close(sock); #endif
Stell mal den ganzen Code rein. So wie es da steht funktioniert da gar nichts.
string text = "Hallo heute ist ein schöner Tag"; test_len = strlen(text); send(sock, text, test_len, 0); die Frage ist was string ist - den gibt es bei C/C++ erstmal nicht. Wenn es aber etwas ist was sich auf "const char*" für strlen und "void*" für send casten lässt sollte es so gehen.
@localhost > C++/STL > std::string Das geht dann aber nicht strlen(text); dafür gibt es dann text.size(); also ein std::string kann es nicht sein.
Oh Shit, klar es gibt in C kein string, -> andere baustelle! Stelle den Code gleich mal online, versuche gerade noch was! Kann man etwas aus dem UNIX vi Editor raus kopieren und dann hier einfügen ?? bin mit putty auf Unix verbunden!! Kann sein das es eine doofe frage ist, habe vorher ausschliesslich C# programmiert. C auf UNIX ist neu Danke
Genau. Deshalb sage ich, den ganzen Code reinstellen. Sonst ist es Jeopardy.
> Kann man etwas aus dem UNIX vi Editor raus kopieren und dann hier > einfügen ?? Warum denn nicht, in der Zeit wie du das geschrieben hast, hätte ich er vorher einfach mal getestet.
Google nach zotteljedi, der hat sich da lang genug drüber ausgelassen...
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> /*Headerfiles fuer Unix */ #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <arpa/inet.h> #include <unistd.h> #define PORT 1234 #define RCVBUFSIZE 8192 /*Funktion gibt auftretende Fehler aus und beendet die Anwendung */ static void error_exit(char *errorMessage){ #ifdef _WIN32 fprintf(stderr, "%s: %d\n", errorMessage, WSAGetLastError()); #else fprintf(stderr, "%s: %s\n", errorMessage, strerror(errno)); #endif exit(EXIT_FAILURE); } B B //* Begin Hauptfunktion */ iint main( int argc, char **argv) { struct sockaddr_in server; struct hostent *host_info; unsigned long addr; #ifdef _WIN32 SOCKET sock; #else int sock; #endif char *echo_string; int echo_len; b B i/* Beginn Initialisierung TCP fuer Windows */ #ifdef _WIN32 /* Initialisiere TCP füdows ("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"); #endif /* Sind die erforderlichen Kommandozeilenargumente vorhanden? */ if (argc < 3) error_exit("usage: client server-ip echo_word\n"); /* 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 */ ient server-ip echo_word\n"); /* 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ü Fall der Fäe: 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"); /* Zweites Argument wird als "echo" beim Server verwendet */ echo_string = argv[2]; /* Läe der Eingabe */ echo_len = strlen(echo_string); /* Denn String inkl. Nullterminator an den Server senden */ if (send(sock, echo_string, echo_len, 0) != echo_len) error_exit("send() hat eine unterschiedliche Anzahl" " von Bytes versendet, als erwartet !!!!"); /* Schlieà Verbindung und Socket */ #ifdef _WIN32 closesocket(sock); /* Cleanup Winsock */ WSACleanup(); #else close(sock); #endif return EXIT_SUCCESS ; } Hilft das weiter ??
> echo_len = strlen(echo_string); > /* Denn String inkl. Nullterminator an den Server senden */ > if (send(sock, echo_string, echo_len, 0) != echo_len) damit wird aber nicht der Nullterminator gesendet, weil strlen in nicht mit zählt.
> echo_len = strlen(echo_string); > /* Denn String inkl. Nullterminator an den Server senden */ > if (send(sock, echo_string, echo_len, 0) != echo_len) damit wird aber nicht der Nullterminator gesendet, weil strlen in nicht mit zählt. reicht es echo_len=echo_len+1 zu rechnen damit der Null Terminator mit gesendet wird ?? Ja oder
> reicht es echo_len=echo_len+1 zu rechnen damit der Null Terminator mit > gesendet wird ?? Ja oder ja
Vielen Vielen Dank für eure Hilfe, jetzt klappt alles @ Peter, dir besonderen Dank Skywalker
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.