www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C /C++ Daten einlesen von TCP/UDP


Autor: Carolin Zapa (seobalis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

bisher habe ich in C die Daten nur von eine Text Editor gelesen und 
wieder zu text Editor ausgegeben.

Deswegen weiß ich nicht genau wie ich die Daten von dem Client lesen 
oder schreiben kann.

Ich arbeite mit Linux und ich kann nur wissen dass ich die Daten 
bekommen habe, aber ich habe noch keine Ahnung, wie ich die Daten in C 
arbeiten kann

Ich bin sehr dankbar wenn ihr mir weiter helfen könnte.

Carolin

Autor: Tilo L. (katagia)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Unter Linux kann man "socket" verwenden. Damit kann man dann
den Zugriff auf "Dateizugriff" runterbrechen. Ob das unter Windows
auch geht, weiß ich nicht.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tilo Lutz wrote:
> Unter Linux kann man "socket" verwenden. Damit kann man dann
> den Zugriff auf "Dateizugriff" runterbrechen. Ob das unter Windows
> auch geht, weiß ich nicht.

Ja, geht genauso.

Allerdings werde ich aus der ursprünglichen Anfrage nicht schlau,
wo denn eigentlich das Problem liegt. Eventuell reagiere ich jetzt
wieder über, aber für mich klingt das wieder mal nach: Die Aufgabe
ist noch mindestens 5 Nummern zu groß (schwer) für den Programmierer.

Der OP könnte das jetzt mal als Hinweis nehmen, seine Fragestellung
zu überarbeiten und von der Rundumschlagfrage 'Ich hab keine Ahnung,
bitte helft mir' zu einer konkreten Fragestellung überzugehen.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
versuche erstmal ein paar mehr Infos zu bekommen.
TCP oder UDP oder per HTTP/FTP.

Netzwerk kann auch sein, eine Datei über Samba/NFS zu öffnen, dann geht 
es wie mit jeder anderen Datei auch, das BS macht den rest.

mfg

Autor: Carolin Zapa (seobalis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger wrote:
> Tilo Lutz wrote:
>> Unter Linux kann man "socket" verwenden. Damit kann man dann
>> den Zugriff auf "Dateizugriff" runterbrechen. Ob das unter Windows
>> auch geht, weiß ich nicht.
>
> Ja, geht genauso.
>
> Allerdings werde ich aus der ursprünglichen Anfrage nicht schlau,
> wo denn eigentlich das Problem liegt. Eventuell reagiere ich jetzt
> wieder über, aber für mich klingt das wieder mal nach: Die Aufgabe
> ist noch mindestens 5 Nummern zu groß (schwer) für den Programmierer.

Die Aufgabe ist vllt schwer für mich. Weil ich noch nie mit socket 
gearbeitet habe.

Wie gesagt ich habe nur mit Text editor die daten gelesen
also

FILE *data_fp

data_fp = fopen(...);

Aber mit dem IP-Addr und Port habe ich noch keine Erfahrung.

Ich versuche gerade die Information über socket zu verstehen und zu 
schreiben aber das Programm läuft noch nicht bei mir

einen Socket anzuforden habe ich geschafft mit

socket(AF_INET, SOCK_STREAM; 0);

aber ich konnte keine Verbindung aufbauen

Gruß

Carolin

Autor: Carolin Zapa (seobalis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe folgende Code geschrieben aber ich bekomme immer noch keine 
Daten. Ich bekomme eine Meldung:

Transport endpoint is not coneccted obwohl ich sehen kann dass ich daten 
bekomme mit ein Hilfprogramm (Wireshark)
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd == -1){
perror("socket()");
}
struct sockaddr_in serv_addr, client;
serv_addr.sin_family = AF_INET;
serv_sin_port = htons(SERVER_PORT);
serv_addr.sin_addr.s_addr = inet_addr("120.220.0.1");
if(bind(sochfd, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) == -1){
perror("bind()");
}
if(listen(sockfd, 5) == -1){
perror("listen()");
}
char buffer[1024];
int len;
len = sizeof(client);
if(recvfrom(sockfd, buffer, 1024, 0, (struct sockaddr*) &client, &len) == -1){
perror("recvfrom()");
}
Carolin

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso bind und listen?
Ich denke du schreibst den Client!

Also, per socket() einen Socket anfodern. Dann mittels
connect() mit dem Serer connecten und schon kannst du Daten
hin und her schieben.

Dazu gibts doch massenhaft Tutorials im Web.

Autor: Carolin Zapa (seobalis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger wrote:
> Wieso bind und listen?
> Ich denke du schreibst den Client!
nein ich bekomme den Daten vom Client. Und ich muss mit der Daten 
arbeiten dachnach wieder zurück zum Client schicken.

Ich versuche erstmal den Daten zu bekommen

Carolin

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Carolin Zapa wrote:
> Karl heinz Buchegger wrote:
>> Wieso bind und listen?
>> Ich denke du schreibst den Client!
> nein ich bekomme den Daten vom Client.

Ah, ok. Dann hab ich das falsch verstanden.
D.h. du schreibst den Server. Dann geht der Weg
allerdings wirklich über bind und listen. Aber erst
durch accept() kriegst du dann einen neuen Socket
der erzeugt wird, wenn der Client tatsächlich verbindet
und auf dem die Datenübertragung läuft.

Siehe zb.
http://www.csc.villanova.edu/~mdamian/Sockets/TcpSockets.htm

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
recvfrom ist für Empfang von UDP-Daten, du hast aber einen TCP-Socket 
(SOCK_STREAM) geöffnet...

Soll der Server denn nun für TCP oder für UDP sein?

Autor: Bernhard M. (boregard)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier ein Beispiel server für Linux, Aufruf z.B. mit

server localhost 5555

...

Autor: Bernhard M. (boregard)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
... und der client...

client localhost 5555

Autor: Carolin Zapa (seobalis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ernst Bachmann wrote:
> recvfrom ist für Empfang von UDP-Daten, du hast aber einen TCP-Socket
> (SOCK_STREAM) geöffnet...
>
> Soll der Server denn nun für TCP oder für UDP sein?

für UDP aber wenn ich SOCK_DGRAM benutze dann komme die Meldung
bind() Address already in use

Autor: Artur Funk (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Im Anhang findest du von mir ein kleines Beispiel eines TCP-Servers im 
Form vom http Server (achtung Portnummer beachten). Das ganze auf Linux 
umzuprogrammieren ist recht easy, man muss nur beachten, dass die 
Threads unter linux anders programmiert werden. Ach ja und die inlude 
files nicht vergessen.

Autor: Carolin Zapa (seobalis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit UDP schreibe ich mit SOCK_DGRAM
 int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
 if(sockfd == -1){
 perror("socket()");
 }
 struct sockaddr_in serv_addr, client;
 serv_addr.sin_family = AF_INET;
 serv_sin_port = htons(SERVER_PORT);
 serv_addr.sin_addr.s_addr = inet_addr("120.220.0.1");
//or serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
 if(bind(sochfd, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) == -1){
 perror("bind()");
 }
  char buffer[1024];
 socklen_t len;
 len = (int) sizeof(client);
 if(recvfrom(sockfd, buffer, 1024, 0, (struct sockaddr*) &client, &len)
 == -1){
 perror("recvfrom()");
 }
 

Und kommt immer noch die Meldung

bind()Address already in use :(

Carolin

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> serv_addr.sin_family = AF_INET;
> serv_sin_port = htons(SERVER_PORT);

Sollte das nicht

  serv_addr.sin_port = htons(SERVER_PORT);

heissen?

Autor: Carolin Zapa (seobalis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger wrote:
>> serv_addr.sin_family = AF_INET;
>> serv_sin_port = htons(SERVER_PORT);
>
> Sollte das nicht
>
>   serv_addr.sin_port = htons(SERVER_PORT);
>
> heissen?

ja doch. Das war ein Schrebfehler.

Carolin

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Carolin Zapa wrote:
> Karl heinz Buchegger wrote:
>>> serv_addr.sin_family = AF_INET;
>>> serv_sin_port = htons(SERVER_PORT);
>>
>> Sollte das nicht
>>
>>   serv_addr.sin_port = htons(SERVER_PORT);
>>
>> heissen?
>
> ja doch. Das war ein Schrebfehler.

Du sollst Code den du hier reinstellst nicht abtippen, sondern
per Copy&Paste hierher kopieren. Das vermeidet dann auch,
dass Leute Fehler melden, die im richtigen Code gar nicht
vorhanden sind.

Autor: Bernhard M. (boregard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Folgender Artikel ist bekannt??
http://www.ibm.com/developerworks/linux/library/l-sockpit/

und der Port ist unter 1024 (oder Programm läuft als root)??

Autor: Carolin Zapa (seobalis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernhard M. wrote:
> Folgender Artikel ist bekannt??
> http://www.ibm.com/developerworks/linux/library/l-sockpit/
>
> und der Port ist unter 1024 (oder Programm läuft als root)??

Danke. Ich habe den Port 1024 benutzt. Es war dumm von mir.

Jetzt läuft das Programm

Carolin

Autor: Bernhard M. (boregard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernhard M. wrote:
> Folgender Artikel ist bekannt??
> http://www.ibm.com/developerworks/linux/library/l-sockpit/
>
> und der Port ist unter 1024 (oder Programm läuft als root)??

uups, Ports für user müssen natürlich über 1024 sein...

Autor: Carolin Zapa (seobalis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernhard M. wrote:
> Bernhard M. wrote:
>> Folgender Artikel ist bekannt??
>> http://www.ibm.com/developerworks/linux/library/l-sockpit/
>>
>> und der Port ist unter 1024 (oder Programm läuft als root)??
>
> uups, Ports für user müssen natürlich über 1024 sein...

Ich habe Port 1024 benutzt aber port 0..1024 unter Linux ist für root.

Ich habe jetzt 5001 genommen und das läuft.

Carolin

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.