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


von Carolin Z. (seobalis)


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

von Tilo (Gast)


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.

von Karl H. (kbuchegg)


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.

von Peter (Gast)


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

von Carolin Z. (seobalis)


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

von Carolin Z. (seobalis)


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)
1
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
2
if(sockfd == -1){
3
perror("socket()");
4
}
5
struct sockaddr_in serv_addr, client;
6
serv_addr.sin_family = AF_INET;
7
serv_sin_port = htons(SERVER_PORT);
8
serv_addr.sin_addr.s_addr = inet_addr("120.220.0.1");
9
if(bind(sochfd, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) == -1){
10
perror("bind()");
11
}
12
if(listen(sockfd, 5) == -1){
13
perror("listen()");
14
}
15
char buffer[1024];
16
int len;
17
len = sizeof(client);
18
if(recvfrom(sockfd, buffer, 1024, 0, (struct sockaddr*) &client, &len) == -1){
19
perror("recvfrom()");
20
}
Carolin

von Karl H. (kbuchegg)


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.

von Carolin Z. (seobalis)


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

von Karl H. (kbuchegg)


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

von Εrnst B. (ernst)


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?

von Bernhard M. (boregard)


Angehängte Dateien:

Lesenswert?

Hier ein Beispiel server für Linux, Aufruf z.B. mit

server localhost 5555

...

von Bernhard M. (boregard)


Angehängte Dateien:

Lesenswert?

... und der client...

client localhost 5555

von Carolin Z. (seobalis)


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

von Artur Funk (Gast)


Angehängte Dateien:

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.

von Carolin Z. (seobalis)


Lesenswert?

Mit UDP schreibe ich mit SOCK_DGRAM
1
 int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
2
 if(sockfd == -1){
3
 perror("socket()");
4
 }
5
 struct sockaddr_in serv_addr, client;
6
 serv_addr.sin_family = AF_INET;
7
 serv_sin_port = htons(SERVER_PORT);
8
 serv_addr.sin_addr.s_addr = inet_addr("120.220.0.1");
9
//or serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
10
 if(bind(sochfd, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) == -1){
11
 perror("bind()");
12
 }
13
  char buffer[1024];
14
 socklen_t len;
15
 len = (int) sizeof(client);
16
 if(recvfrom(sockfd, buffer, 1024, 0, (struct sockaddr*) &client, &len)
17
 == -1){
18
 perror("recvfrom()");
19
 }

Und kommt immer noch die Meldung

bind()Address already in use :(

Carolin

von Karl H. (kbuchegg)


Lesenswert?

> serv_addr.sin_family = AF_INET;
> serv_sin_port = htons(SERVER_PORT);

Sollte das nicht

  serv_addr.sin_port = htons(SERVER_PORT);

heissen?

von Carolin Z. (seobalis)


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

von Karl H. (kbuchegg)


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.

von Bernhard M. (boregard)


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)??

von Carolin Z. (seobalis)


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

von Bernhard M. (boregard)


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

von Carolin Z. (seobalis)


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

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
Noch kein Account? Hier anmelden.