05.11.2013 Aufrufe

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

210 4 Gr<strong>und</strong>lagen der Socket-Programmierung<br />

können wir auch hier auf die connect()-Funktion zurückgreifen. Der Einsatz<br />

von connect() für UDP-<strong>Sockets</strong> führt natürlich keinesfalls zu einer Netzwerkverbindung<br />

wie bei TCP <strong>und</strong> da<strong>mit</strong> selbstverständlich auch nicht zu einem<br />

gesicherten Datenaustausch, aber der Systemkern ordnet dem Socket eine Ziel-<br />

IP-Adresse samt Portnummer zu, kümmert sich um offensichtliche Fehler <strong>und</strong><br />

gibt diese direkt an die Anwendung zurück. Wird die connect()-Funktion<br />

für einen UDP-Socket aufgerufen, dann sprechen wir von einem verb<strong>und</strong>enen<br />

UDP-Socket, für den im weiteren Verlauf des Programms die folgenden<br />

Punkte zu beachten sind:<br />

1. Durch die connect()-Funktion wurde für den Socket die Socket-Adresse<br />

des Kommunikationspartners, also dessen IP-Adresse <strong>und</strong> Portnummer,<br />

festgeschrieben. Diese Daten können deshalb nicht mehr beim Versand<br />

der Daten angegeben werden. Entweder ersetzen wir deshalb die Funktion<br />

sendto() wieder durch ihr Äquivalent write(), oder wir müssen beim<br />

Aufruf von sendto() einen Nullzeiger als Socket-Adresse dest_addr angeben<br />

<strong>und</strong> für dest_len den Wert 0 übergeben.<br />

2. Die recvfrom()-Funktion wird für einen verb<strong>und</strong>enen UDP-Socket auf<br />

ausschließlich den Empfang von Daten des festgelegten Kommunikationspartners<br />

eingeschränkt. Treffen UDP-Datagramme von Absendern <strong>mit</strong><br />

einer anderen Socket-Adresse ein, werden diese nicht an den verb<strong>und</strong>enen<br />

UDP-Socket weitergeleitet. Dieses Verhalten wird im Allgemeinen für<br />

ein Serverprogramm eine inakzeptable Einschränkung bedeuten, denn ein<br />

Server kommuniziert im Normalfall <strong>mit</strong> vielen Clients. Für ein Clientprogramm<br />

ist die Restriktion dagegen in aller Regel nicht weiter dramatisch.<br />

3. Im Gegensatz zu normalen“, nicht verb<strong>und</strong>enen UDP-<strong>Sockets</strong> werden<br />

”<br />

asynchron zum Datenaustausch auftretende Fehler nachfolgend an die Anwendung<br />

zurückgeliefert.<br />

4. Je nach Implementierung kann ein sendto() über einen verb<strong>und</strong>enen<br />

Socket schneller sein als über einen nicht verb<strong>und</strong>enen Socket. Um über<br />

einen nicht verb<strong>und</strong>enen Socket Daten zu verschicken verbinden BSD-<br />

Systeme z. B. den Socket kurzfristig <strong>mit</strong> der übergebenen Socket-Adresse,<br />

verschicken die Daten <strong>und</strong> heben dann die Verbindung wieder auf. Ist der<br />

Socket bereits <strong>mit</strong>tels connect() verb<strong>und</strong>en, so entfällt dieser Vorgang.<br />

Über einen erneuten Aufruf von connect() kann übrigens die Verknüpfung<br />

zwischen Socket <strong>und</strong> Socket-Adresse geändert oder wieder aufgehoben werden.<br />

27 Um eine Assoziation zwischen Socket <strong>und</strong> Socket-Adresse aufzuheben,<br />

wird das sin_family- bzw.sin6_family-Element der übergebenen Socket-<br />

Adreßstruktur auf den Wert AF_UNSPEC gesetzt. Der eventuell von connect()<br />

zurückgelieferter Fehlercode EAFNOSUPPORT ist dabei durchaus in Ordnung.<br />

27 Im Gegensatz dazu kann die connect()-Funktion für TCP-<strong>Sockets</strong> lediglich ein<br />

einziges Mal pro Socket aufgerufen werden.

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!