B
boss3D
Guest
[C] Socket für TCP/UDP Übertragung programmieren
Hi @ all!
Folgende Aufgabe:
Dazu haben wir auch 3 virtuelle Maschinen (NET1UE-Client, NET1UE-Server, NET1UE-Router) bekommen, alle 3 mit Debian. Ich arbeite dabei mit dem VMWare Player und putty. In die Client und die Server VM muss ich dann meinen Code einfügen und dann ausführen. Dann müsste das laufen.
So sieht der Netzplan aus:
Und so natürlich eine TCP/UDP Datenübertragung:
Entsprechend der Aufgabe a habe ich jetzt erstmal die nötigen Funktionen versucht nach diesem HowTo zu programmieren, v.a. weil's da auch recht schön erklärt wird, was eigentlich wo passiert.
Hier mein aktueller Code:
^^ Nicht wundern wegen der vielen Bibliotheksfunktionen. Da ich im Visual Studio programmiere, musste alles für Windows rein und weil's dann aber später unter Debian laufen soll, auch alles für Linux/Unix. Durch's if/else kann der Compiler eh schön unterscheiden und sich das holen, was er braucht.
So, und jetzt zu meinen Fragen:
1.) Wo die drei roten fetten XXX sind, was genau muss dahin? Das ist das einzige, was ich aus dem HowTo nicht wirklich herauslesen konnte. Da stand nur irgendwas von wegen so ähnlich wie's normale send() und recv(), aber mit ein paar zusätzlichen Zeilen?!
2.) socklen_t wird mir im Visual Studio rot unterwellt und als undefined beschrieben. In welcher Bibliotheksfunktion, die ich noch nicht eingebunden habe, soll das denn drinnen sein? Durch googeln bin ich auch nicht schlauer geworden. Wenn's allerdings nur unter Windows nicht gefunden wird, unter Linux dann aber schon, wäre es eh halb so wild.
3.) Was ich dann noch bräuchte, wäre irgendwas, wo der User über Parameter, die direkt an die main übergeben werden, auswählen kann, ob er Client oder Server sein will und ob ein beliebiger Text (ebenfalls als Parameter) per TCP oder UDP übertragen werden soll. Auch der entsprechende Port soll beim Server mitübergeben werden. Eben so, wie's in der Angabe steht. Da weiß ich noch nicht so recht, wie ich das machen soll ...
Irgendwie so vielleicht:
^^ Nur, dass das so enorm viel Code werden würde, weil ich ja fast alles dann mindestens doppelt drinne hätte. Das kann's ja nicht sein?!
4.) Der Lehrer hat gemeint, einen wirklich minimalen Code für diese Aufgabe könnte man auch mit ~ 40 Zeilen schreiben, sodass der immer noch die Aufgabenstellung erfüllt. Ergo muss ich ja jede Menge "unnützes" Zeug drinnen haben?! Kann mir da jemand bitte beim "Ausmisten" helfen?! Was brauche ich denn alles eigentlich gar nicht? Im Übrigen ist der Code aus dem HowTo wahrscheinlich eh nicht 1:1 für meine Aufgabenstellung brauchbar. Hier und da (z.B. bei den IP-Adressen --> siehe Netzplan oben) bräuchte ich auch noch ein Bisschen Hilfe beim Anpassen, bitte.
Danke für baldige Antworten!
Hi @ all!
Folgende Aufgabe:
Dazu haben wir auch 3 virtuelle Maschinen (NET1UE-Client, NET1UE-Server, NET1UE-Router) bekommen, alle 3 mit Debian. Ich arbeite dabei mit dem VMWare Player und putty. In die Client und die Server VM muss ich dann meinen Code einfügen und dann ausführen. Dann müsste das laufen.
So sieht der Netzplan aus:
Und so natürlich eine TCP/UDP Datenübertragung:
Entsprechend der Aufgabe a habe ich jetzt erstmal die nötigen Funktionen versucht nach diesem HowTo zu programmieren, v.a. weil's da auch recht schön erklärt wird, was eigentlich wo passiert.
Hier mein aktueller Code:
Code:
#include <stdio.h>
#include <errno.h>
#include <string>
#ifdef _WIN32
#include <winsock.h>
#else
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
#endif
int main(int argc, char *argv[]) {
[COLOR=seagreen]/* Client: */
[COLOR=seagreen] /* socket() - Socket anfordern */ int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {
perror("socket()");
}
[COLOR=seagreen]/* connect() - Verbindung aufbauen */ sockaddr_in serv_addr;
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(80);
serv_addr.sin_addr.s_addr = inet_addr("192.168.3.1/24");
servent* serviceinfo = getservbyname ("http", "tcp");
serv_addr.sin_port = serviceinfo->s_port;
if (connect(sockfd, (sockaddr *) &serv_addr, sizeof(sockaddr)) == -1) {
perror ("connect()");
}
[COLOR=seagreen]/* send() und recv() - Senden und Empfangen mit TCP */ char *msg = "Test-Nachricht.\n";
int len = strlen (msg);
if (send (sockfd, msg, len, 0) == -1) {
perror ("send()");
}
char buf[1024];
if (recv (sockfd, buf, 1024, 0) == -1) {
perror ("recv()");
}
[COLOR=seagreen]/* sendto() und recvfrom() - Senden und Empfangen mit UDP */ [COLOR=red][B]XXX[/B]
[COLOR=seagreen]/* close() - Socket freigeben */ int close(int fd); [COLOR=seagreen]/* closesocket() für Windows */
[COLOR=seagreen]/*-----------------------------------------------------------------*/ [COLOR=seagreen]/* Server: */
[COLOR=seagreen]/* bind() - Den eigenen Port festlegen */ sockaddr_in my_addr;
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(5000);
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(sockfd, (sockaddr *)&my_addr, sizeof(sockaddr)) == -1) {
perror ("bind()");
}
[COLOR=seagreen]/* Zugewiesenen Port ermitteln: */ [B][COLOR=red]socklen_t[/B] len;
getsockname(sockfd, (sockaddr *) &my_addr, &len);
printf("Port: %d\n", ntohs(my_addr.sin_port));
[COLOR=seagreen]/* listen() - Auf eingehende Verbindungen warten */ if (listen (sockfd, 5) == -1) {
perror ("listen()");
}
[COLOR=seagreen]/* accept() - Die eingehende Verbindung annehmen */ [COLOR=red][B]socklen_t[/B] sin_size = sizeof (sockaddr_in);
sockaddr_in remote_host;
int sock2 = accept (sockfd, (sockaddr *) &remote_host, &sin_size);
if (sock2 == -1) {
perror ("accept()");
}
return 0;
}
So, und jetzt zu meinen Fragen:
1.) Wo die drei roten fetten XXX sind, was genau muss dahin? Das ist das einzige, was ich aus dem HowTo nicht wirklich herauslesen konnte. Da stand nur irgendwas von wegen so ähnlich wie's normale send() und recv(), aber mit ein paar zusätzlichen Zeilen?!
2.) socklen_t wird mir im Visual Studio rot unterwellt und als undefined beschrieben. In welcher Bibliotheksfunktion, die ich noch nicht eingebunden habe, soll das denn drinnen sein? Durch googeln bin ich auch nicht schlauer geworden. Wenn's allerdings nur unter Windows nicht gefunden wird, unter Linux dann aber schon, wäre es eh halb so wild.
3.) Was ich dann noch bräuchte, wäre irgendwas, wo der User über Parameter, die direkt an die main übergeben werden, auswählen kann, ob er Client oder Server sein will und ob ein beliebiger Text (ebenfalls als Parameter) per TCP oder UDP übertragen werden soll. Auch der entsprechende Port soll beim Server mitübergeben werden. Eben so, wie's in der Angabe steht. Da weiß ich noch nicht so recht, wie ich das machen soll ...
Irgendwie so vielleicht:
Code:
int main(int argc, char *argv[]) {
if (argv[1]=="Client") {
if (argv[2]=="TCP") {
[COLOR=seagreen]// Client-TCP Code } else if (argv[2]=="UDP"){
[COLOR=seagreen]// Client UDP-Code }
} else if (argv[1]=="Server") {
if (argv[2]=="TCP") {
[COLOR=seagreen]// Server-TCP Code } else if (argv[2]=="UDP"){
[COLOR=seagreen]// Server-UDP Code }
}
return 0;
}
4.) Der Lehrer hat gemeint, einen wirklich minimalen Code für diese Aufgabe könnte man auch mit ~ 40 Zeilen schreiben, sodass der immer noch die Aufgabenstellung erfüllt. Ergo muss ich ja jede Menge "unnützes" Zeug drinnen haben?! Kann mir da jemand bitte beim "Ausmisten" helfen?! Was brauche ich denn alles eigentlich gar nicht? Im Übrigen ist der Code aus dem HowTo wahrscheinlich eh nicht 1:1 für meine Aufgabenstellung brauchbar. Hier und da (z.B. bei den IP-Adressen --> siehe Netzplan oben) bräuchte ich auch noch ein Bisschen Hilfe beim Anpassen, bitte.
Danke für baldige Antworten!