mikrocontroller.net

Forum: PC-Programmierung C TCP / IP String senden


Autor: Skywalker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn du schon soweit bist, warum rufst du nicht einfach "send" mit den 
passenden Parameter auf?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Skywalker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: localhost (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stell mal den ganzen Code rein. So wie es da steht funktioniert da gar 
nichts.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: localhost (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
C++/STL

std::string

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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.

Autor: Skywalker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: localhost (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau. Deshalb sage ich, den ganzen Code reinstellen. Sonst ist es 
Jeopardy.

Autor: localhost (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mit putty ist das ein normales Copy/Paste.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: Link zu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Google nach zotteljedi, der hat sich da lang genug drüber ausgelassen...

Autor: Skywalker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#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 ??

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>    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.

Autor: Skywalker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>    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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> reicht es echo_len=echo_len+1 zu rechnen damit der Null Terminator mit
> gesendet wird ?? Ja oder
ja

Autor: Skywalker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Vielen Dank für eure Hilfe, jetzt klappt alles

@ Peter, dir besonderen Dank


Skywalker

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.