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ösung Übung 2 POSIX-API

- Ohne Gewähr -

C++
 
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <netdb.h>
 
using namespace std;
 
class brauchtHilfe {};
class SendError {};
class RecieveError {};
class BindError {};
class AddrError {}; //Wenn POSIX Mist macht...
 
int main(int argc, char* const argv[])
{
	sockaddr_in server_addr; // srv adresse (Sende spaeter alles dahin...)
	addrinfo * t_addr; // ziel-Adresse (fuer Hostname-Gedoens)
	int check_addr; // zur Fehlerbehandlung
	int port; // srv port
	int sfd;
	int sendToS;
	int recvFromS;
	char nachricht[] = "Knock Knock Neo";
	char send_buffer[1024];
 
	try
	{
		if(argc != 3)
			throw brauchtHilfe();
 
		// eingabe
		for(int i = 0; i < argc; i++)
		{
			cout << "argv[" <<  i << "] = " << argv[i] << endl;
		}
 
		// IP und PORT aus Kommandozeile auslesen
		check_addr = getaddrinfo(argv[1], NULL, NULL, &t_addr);
 
		if(check_addr != 0)
			throw AddrError();
 
		port = atoi(argv[2]);
 
		// Init
		server_addr.sin_family = AF_INET;
		server_addr.sin_addr = ((sockaddr_in*)(t_addr->ai_addr))->sin_addr;
		server_addr.sin_port = htons(port);
 
		// mach Socket
		sfd = socket(AF_INET, SOCK_DGRAM, 0);
		if(sfd == -1)
			throw BindError();
 
		// sende ab
		sendToS = sendto(	sfd,
					nachricht,
					strlen(nachricht) + 1,
					0,
					(sockaddr*)&server_addr,
					(socklen_t)sizeof(server_addr)	);
 
		if(sendToS == -1)
			throw SendError();
 
		// erhalte Antwort
		socklen_t size = sizeof(server_addr);
		recvFromS = recvfrom(sfd, send_buffer, sizeof(send_buffer), 0, (sockaddr*)&server_addr, &size);
 
		if(recvFromS == -1)
			throw RecieveError();
 
		// und ausgeben
		cout << "Antwort erhalten: " << send_buffer << endl;
 
		// tschuess
		close(sfd);
 
	}
	catch(brauchtHilfe)
	{
		cout << "nix verstehe... benutze: " << argv[0] << " IP[,HOSTNAME] PORT \n";
	}
 
	catch(SendError)
	{
		cout << "Sendefehler...";
	}
 
	catch(AddrError)
	{
		cout << "Fehler in der Adresse...";
	}
 
	catch(RecieveError)
	{
		cout << "Empfangserror...";
	}
 
	catch(BindError)
	{
		cout << "Binderror...";
	}
 
	catch(...)
	{
		cout << "Fehler!";
	}
}
 
 

- Ohne Gewähr -

| Mehr

Zahlen & Daten

  • 1714 Seitenaufrufe
  • 738 Tage alt
  • 4 Versionen
  • Letzte Änderung: 12.05.2010 um 16:31 Uhr

Publish