Was ist das hier?

  • Eine Plattform von Flensburger Studenten für Flensburger Studenten
  • Ein Wiki zum Sammeln von Wissen
  • Ein Forum zum Austausch
  • Eine Wissensdatenbank zum Informatikstudium:
    • Programmieren in C, C#, PHP, Javascript, HTML, CSS
    • Datenbanken und Abfragen mit SQL
    • 2D / 3D - Gestaltung
    • Mathe, Physik, Gerätetechnik, RoBs
    • Audio- / Videotechnik
    • ...und vieles mehr

Anmelden

Warum registrieren?

Weil besser als gut!

 

Lösungsansatz Übung 1 NWK

LÖSUNG ZU ÜBUNG1

Allgemeines

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

Was

Aufgabe 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:

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

Wie

Serverseitig

Grundsä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:

#includestellt bereit
unistd.hclose()
arpa/inet.hinet_ntoa
netinet/in.hsockaddr_in

Serverseitig

C++
 
#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!";
	}
}
 

Clientseitig

C++
 
#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!";
	}
}
 

=

| Mehr

Zahlen & Daten

  • 1880 Seitenaufrufe
  • 759 Tage alt
  • 28 Versionen
  • Letzte Änderung: 26.05.2010 um 10:19 Uhr

Publish