Weil besser als gut!

Lösungsansatz Übung 1 NWKInhaltsverzeichnis AllgemeinesDie Aufgabe für das erste Labor ist in Übung1.pdf beschrieben. Grundlagen zur Lösung wurden in der Vorlesung 5 gelegt. Die Kombination aus grundlegenden C/C++ Kenntnissen und der Vorlesungszusammenfassung des Dozenten ergibt die Lösung zur Aufgabe. Wer dabei verständlicherweise Schwierigkeiten hat nimmt natürlich diesen Wiki Artikel zu Hilfe. WasAufgabe ist es, 2 Programme zu schreiben, die die Kommunikation zwischen einem Service und einem Client über eine Socketverbindung demonstrieren. Dabei gilt der folgende Gesprächsverlauf: Für die linke (Server) und die rechte (Client) Seite wird jetzt jeweils ein c++ Programm erstellt, das die jeweilige Funktion bereitstellt. Des weiteren gelten die Vorbedingungen für die Übungen WieServerseitigGrundsätzlich handelt es sich um den Einsatz vorhandener Structures Zunächsteinmal wird der der Abschnitt mit den INCLUDES entsprechend der Vorlesung 5 ergänzt um C++ #include <unistd.h> #include <arpa/inet.h> #include <netinet/in.h> Dabei gilt:
ServerseitigC++ #include <unistd.h> #include <arpa/inet.h> #include <netinet/in.h> #include <stdio.h> #include <iostream> using namespace std; const int SERVER_PORT = 1234; int main(int argc, char* argv[]) { try { // SERVERKOMMUNIKATION // sockaddr_in own_addr; // SERVER ADRESS-VARIABLE sockaddr_in other_addr; // CLIENT ADRESS-VARIABLE int sfd; //SOCKET DESCRIPTOR int BINDING; //FEHLERCODE -1 int SENDING; // ANZAHL DER GESENDETEN BYTES; FEHLERCODE -1 int RECV; // ANZAHL DER EMPFANGENEN BYTES; FEHLERCODE -1 char buf_ptr[256]; // CHAR*-Variable FUER EMPFANGENE DATEN unsigned long test = inet_addr("127.0.0.1"); // IP FUER LOKALENTEST¸ // EIGENE ADRESS-VARIABLE INITIALISIEREN // own_addr.sin_family = AF_INET; own_addr.sin_port = htons(SERVER_PORT); own_addr.sin_addr.s_addr = htonl(INADDR_ANY); // htonl(INADDR_ANY) fuer remote; test für // PORT-NUMMER AUSGEBEN // cout << "SERVER-PORT: " << SERVER_PORT << endl; // SOCKET ERSTELLEN UND BINDEN // sfd = socket(AF_INET,SOCK_DGRAM, 0); BINDING = bind(sfd, (sockaddr*)&own_addr, sizeof(own_addr)); // RECEIVE CALL AUSFÜHREN; WARTET BIS ANFRAGE ANKOMMT // socklen_t size = sizeof(other_addr); RECV = recvfrom(sfd, buf_ptr, sizeof(buf_ptr), 0, (sockaddr*)&other_addr, &size); // IP ADRESSE, PORTNUMMER UND NACHRICHT AUSGEBEN // cout << "IP-Adresse des Request: " << ntohl(other_addr.sin_addr.s_addr) << endl; cout << "Portnummer des Request: " << ntohs(other_addr.sin_port) << endl; cout << "Nachricht im Request: " << buf_ptr << endl; cout << "Sende Nachricht zurück! " << endl; // SENDE ANTWORT AN DEN CLIENT // SENDING = sendto( sfd, buf_ptr, strlen(buf_ptr) + 1, 0, (sockaddr*)&other_addr, (socklen_t)sizeof(other_addr) ); // SOCKET SCHLIEßEN // close(sfd); } catch(...) { cout << "error!"; } } ClientseitigC++ #include <unistd.h> #include <arpa/inet.h> #include <netinet/in.h> #include <stdio.h> #include <iostream> #include <stdlib.h> using namespace std; class HILFE{}; int main(int argc, char* const argv[]) { sockaddr_in server_addr; // SERVER ADRESS-VARIABLE unsigned long ip; // AN ZUSENDENE IP-ADRESSE int port; // PORT NUMMER DES SERVER int sfd; // SOCKET-DESCRIPTOR int SENDING; // FEHLERCODE -1 int RECV; // FEHLERCODE -1 char nachricht[] = "Testnachricht"; char buf[256]; try { if(argc != 3) throw HILFE(); // EINGABE AUSGEBEN // for(int c = 0; c < argc; c++) { cout << "argv[" << c << "] = " << argv[c] << endl; } // IP und PORT aus den Kommandozeilenparamter auslesen // ip = inet_addr(argv[1]); port = atoi(argv[2]); // ADRESSE-VARIABLE MIT SERVERINFORMATIONEN INITIALISEREN // server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = ip; server_addr.sin_port = htons(port); // SOCKET ERSTELLEN // sfd = socket(AF_INET, SOCK_DGRAM, 0); // NACHRICHTIG SCHICKEN // SENDING = sendto( sfd, nachricht, strlen(nachricht) + 1, 0, (sockaddr*)&server_addr, (socklen_t)sizeof(server_addr) ); // ANTWORT ERHALTEN // socklen_t size = sizeof(server_addr); RECV = recvfrom(sfd, buf, sizeof(buf), 0, (sockaddr*)&server_addr, &size); // ANTWORT AUSGEBEN // cout << "Antwort erhalten: " << buf << endl; // SOCKET SCHLIEßEN // close(sfd); } catch(HILFE) { cout << "usage: " << argv[0] << " IP PORTn"; } catch(...) { cout << "error!"; } } = |
Zahlen & Daten
Publish |