C /C++ Daten einlesen von TCP/UDP

OP #842187
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
#842218
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.
Gast #842225
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
OP #842233
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
OP #842928
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
#842968
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
Gast #843096
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.
Angehängte Dateien:
OP #843213
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
#843245
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.
OP #843282
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren