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 - |
Zahlen & Daten
Publish |