Lokaler Port
-
hallo,
ich möchte testweise ein IRC-Client schreiben.
Aber dafür muss ich ja eine Ident-Verbindung herstellen. In dieser muss ich ja auch den lokalen Port angeben. Wie finde diesen heraus? Er muss doch irgendwo im struct sockaddr zu finden sein, oder?
Danke!
Arne
-
att309 schrieb:
Aber dafür muss ich ja eine Ident-Verbindung herstellen.
mh nicht bei allen irc-netzwerken, imho.
att309 schrieb:
In dieser muss ich ja auch den lokalen Port angeben. Wie finde diesen heraus? Er muss doch irgendwo im struct sockaddr zu finden sein, oder?
kurz zu dem Ports:
mh ja macht man prinzipiell. Den Port finden musst Du nicht. Du laesst dein client ja zum server verbinden, der server hat oft ein Standardport und die sind oft vorgegeben. Sie stehen alle in /etc/services drin, ein grep nach dem dienst/protokoll sagt meistens einem den Wert des unsigned int, das Transportprotokoll und den fuer den Menschen lesbaren Namen. Es gibt auch die "rfc -n" Moeglichkeit in der Konsole nach einem Port zu suchen, aber das nur mal so am Rande.
Du kannst auch eine Funktion benutzen die dir vom Betriebsystem zur Verfuegung gestellt wird, die Ports für Dienste aus der /etc/services Datei auszulesen und sie dem Programm zu uebergeben, nennt sich getservbyname() und getservbyport(). Man ist zwar von der Datei abhaengig, kann aber etwas dynamischer handeln, imho tut es ein #define PORT 6667 auch, ein mix aus den beiden arten ist da wohl das sinnvollste.zur eigentlichen Frage:
Viele socket funktionen brauchen als argument einen zeiger auf eine socket-adressstruktur, zb. connect(2) oder bind(2) etc.
Da es da draussen verschiedene protokolle gibt, bringt auch jedes protokoll ihre eigene struktur mit. Sprich bei IPv4 benutzt man die struktur sockaddr_in, bei IPv6 sockaddr_in6. Die Deklaration findet sich in der headerdatei <netinet/in.h> wieder, dort kann man auch sehen welche Werte man in die Struktur eintragen kann, sprich dem Protokoll die Werte zuweisen mit den es arbeiten soll. Soweit sogut. Man hat nun z.B. eine Struktur gebastelt:Beispiel:
int port = 6667; // IRC Port struct sockaddr_in client; // unsere ipv4 adress struktur client.sin_family = AF_INET; client.sin_port = htons(port); // hier weitere parameter eingeben.
versucht man diese struktur vom Typ sockaddr_in zb connect weiterzugeben, erhaellt man ein kleines problem.
Wenn man sich die Funktionssignatur aus der manpage von connect genauer anschaut stellt man fest das, das 2. Argument vom typ sockaddr ist, nicht sockaddr_in.
Der Grund ist das die Funktionen generische Adressstrukturen benutzen, das ist etwas bloed in der geschichte gelaufen aber das macht uns nichts weil wir den typ von sockaddr_in in sockaddr leicht umcasten koennen.connect (sockfd, (struct sockaddr *) &client, sizeof(client));
Ich hoffe es kam verstaendlich rueber wie man sich in den Strukturen orientiert. Auf meiner Seite habe ich etwas zum Thema Netzwekprogrammierung zusammengefasst, was man so im Netz findet. Es finden sich auch Codebeispiele und tiefere Erklärungen zu dem Thema. Die Adresse ist:
Wer generell interesse an dem Thema hat, empfehle ich immer noch das gute Stevens, Volume 3 von UNIX Network Programming ist nun ja rausgekommen ,-)
Es ist gerade 10. nach 5, solche Texte sollte man eigentlich um die Zeit nicht schreiben.cya xeam