Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger

 << zurück
Linux-UNIX-Programmierung von Jürgen Wolf
Das umfassende Handbuch – 2., aktualisierte und erweiterte Auflage 2006
Buch: Linux-UNIX-Programmierung

Linux-UNIX-Programmierung
1216 S., mit CD, 49,90 Euro
Rheinwerk Computing
ISBN 3-89842-749-8
gp Kapitel 11 Netzwerkprogrammierung
  gp 11.1 Einführung
  gp 11.2 Aufbau von Netzwerken
    gp 11.2.1 ISO/OSI und TCP/IP – Referenzmodell
    gp 11.2.2 Das World Wide Web (Internet)
  gp 11.3 TCP/IP – Aufbau und Struktur
    gp 11.3.1 Netzwerkschicht (Datenübertragung)
    gp 11.3.2 Internetschicht
    gp 11.3.3 Transportschicht (TCP, UDP)
    gp 11.3.4 Anwendungsschicht
  gp 11.4 TCP Socket
  gp 11.5 Kommunikationsmodell
  gp 11.6 Grundlegende Funktionen zum Zugriff auf die Socket-Schnittstelle
    gp 11.6.1 Ein Socket anlegen – socket()
    gp 11.6.2 Verbindungsaufbau – connect()
    gp 11.6.3 Socket mit einer Adresse verknüpfen – bind()
    gp 11.6.4 Auf Verbindungen warten – listen() und accept()
    gp 11.6.5 Senden und Empfangen von Daten (1) – write() und read()
    gp 11.6.6 Senden und Empfangen von Daten (2) – send() und recv()
    gp 11.6.7 Verbindung schließen – close()
  gp 11.7 Aufbau eines Clientprogramms
    gp 11.7.1 Zusammenfassung: Clientanwendung und Quellcode
  gp 11.8 Aufbau des Serverprogramms
    gp 11.8.1 Zusammenfassung: Serveranwendung und Quellcode
  gp 11.9 IP-Adressen konvertieren, manipulieren und extrahieren
    gp 11.9.1 inet_aton(), inet_pton() und inet_addr()
    gp 11.9.2 inet_ntoa() und inet_ntop()
    gp 11.9.3 inet_network()
    gp 11.9.4 inet_netof()
    gp 11.9.5 inet_lnaof()
    gp 11.9.6 inet_makeaddr()
  gp 11.10 Namen und IP-Adressen umwandeln
    gp 11.10.1 Name-Server
    gp 11.10.2 Informationen zum Rechner im Netz – gethostbyname und gethostbyaddr
    gp 11.10.3 Service-Informationen – getservbyname() und getservbyport()
  gp 11.11 Der Puffer
  gp 11.12 Standard-E/A-Funktionen verwenden
    gp 11.12.1 Pufferung von Standard-E/A-Funktionen
  gp 11.13 Parallele Server
  gp 11.14 Syncrones Multiplexing – select()
  gp 11.15 POSIX-Threads und Netzwerkprogrammierung
  gp 11.16 Optionen für Sockets setzen bzw. erfragen
    gp 11.16.1 setsockopt()
    gp 11.16.2 getsockopt()
    gp 11.16.3 Socket-Optionen
  gp 11.17 UDP
    gp 11.17.1 Clientanwendung
    gp 11.17.2 Serveranwendung
    gp 11.17.3 recvfrom() und sendto()
    gp 11.17.4 bind() verwenden oder weglassen
  gp 11.18 UNIX-Domain-Sockets (IPC)
    gp 11.18.1 Die Adressstruktur von UNIX-Domain-Sockets
    gp 11.18.2 Lokale Sockets erzeugen – socketpair()
  gp 11.19 Multicast-Socket
    gp 11.19.1 Anwendungsgebiete von Multicast-Verbindungen
  gp 11.20 Nicht blockierende I/O-Sockets
  gp 11.21 Etwas zu Streams und TLI, Raw Socket, XTI
    gp 11.21.1 Raw Socket
    gp 11.21.2 TLI und XTI
    gp 11.21.3 RPC (Remote Procedure Call)
  gp 11.22 IPv4 und IPv6
    gp 11.22.1 IPv6 – ein wenig genauer
  gp 11.23 Netzwerksoftware nach IPv6 portieren
    gp 11.23.1 Konstanten
    gp 11.23.2 Strukturen
    gp 11.23.3 Funktionen
  gp 11.24 Sicherheit und Verschlüsselung


Rheinwerk Computing

11.12 Standard-E/A-Funktionen verwendedowntop

Auch wenn es vielleicht den Anschein macht, man könne Sockets nur in Verbindung mit elementaren E/A-Funktionen verwenden, so täuscht dies. Selbstverständlich lassen sich auch Standard-E/A-Funktionen wie fscanf() oder fprintf() bei den Sockets verwenden. Hierbei genügt es, sich einen FILE-Zeiger mit der Funktion fdopen() zu einem Socket-Deskriptor zur Verfügung stellen zu lassen.

Wollen Sie einen FILE-Zeiger zum Lesen und Schreiben öffnen, sei dazu geraten, zwei getrennte FILE-Zeiger zu verwenden. Der Grund ist einfach, wenn Sie nur einen FILE-Zeiger verwenden (z. B. mit "r+" geöffnet), muss nach jeder Ausgabeoperation eine Funktion wie fflush(), fseek(), fsetpos() oder rewind() aufgerufen werden, bevor eine Eingabeoperation ausgeführt wird. Umgekehrt ist dies dasselbe. Das Problem an diesen Funktionen ist, dass diese wiederum auf die elementare Funktion lseek() zurückgreifen. Aber es wurde bereits erwähnt, dass es nicht gestattet ist, lseek() auf Socket-Deskriptoren zu verwenden.

Daher sollten Sie für das Lesen und für das Schreiben jeweils einen eigenen FILE-Zeiger verwenden. Hierzu ist es allerdings notwendig, den Socket-Deskriptor mit dup() zu duplizieren, da man mit unterschiedlichen Streams auch unterschiedliche Deskriptoren verwenden sollte. Ein weiterer Vorteil vom Duplizieren ist, dass Sie somit jederzeit nur einen der FILE-Zeiger schließen können, was ohne zu duplizieren nicht möglich ist.

int sockfd;
FILE *lese_fz;
FILE *schreib_fz;
sockfd = socket(PF_INET, SOCK_STREAM, 0);
/* FILE-Zeiger für das Schreiben */
schreib_fz = fdopen(sockfd, "w");
if( schreib_fz == NULL ) {
   /* Fehler .... */
}
/* FILE-Zeiger für das Lesen */
lese_fz =fdopen(dup(sockfd), "r");
if( lese_fz == NULL ) {
   /* Fehler ... */
}

Wollen Sie jetzt z. B. den FILE-Stream der Leseseite schließen, können Sie dies wie folgt machen:

fclose(lese_fz);

Ähnlich verläuft dies auch, wenn Sie die Schreibseite schließen wollen, nur sollten Sie hierbei zuvor noch fflush() aufrufen, womit alle noch im Puffer befindlichen Daten geschrieben werden:

fflush(schreib_fz);
fclose(schreib_fz);

Sofern Sie hierbei mit fork() einen Kindprozess erzeugt haben und sich nicht sicher sind, ob ein anderer Prozess hierbei noch auf einen offenen Socket-Deskriptor zugreift, sollten Sie außerdem noch zusätzlich beim Schließen die Funktion shutdown() verwenden. Beim Schließen der Leseseite wäre dies:

shutdown( fileno(lese_fz), SHUT_RD );
fclose(lese_fz);

Und beim Schließen der Schreibseite:

fflush(schreib_fz);
shutdown( fileno(schreib_fz), SHUT_RDWR);
fclose(schreib_fz);

Rheinwerk Computing

11.12.1 Pufferung von Standard-E/A-Funktionen  toptop

Natürlich muss man sich bei der Verwendung von Standard-E/A-Funktionen auch wieder Gedanken um die Pufferung der Daten machen. Denn wenn hier die Zeilen- bzw. Vollpufferung eingestellt ist, wird immer erst in das Socket geschrieben, wenn ein Newline-Zeichen vorkommt oder der Puffer voll ist. Besonders wenn Sie etwas in den Puffer schreiben, hat sich ein anschließendes fflush() schon immer bewährt, so dass die Daten im Puffer sofort geschrieben wurden. Natürlich können Sie hier auch die Pufferung des Streams mit den Funktionen setbuf() bzw. setvbuf() verändern.

 << zurück
  
  Zum Rheinwerk-Shop
Neuauflage: Linux-UNIX-Programmierung
Neuauflage:
Linux-UNIX-
Programmierung

bestellen
 Ihre Meinung?
Wie hat Ihnen das Openbook gefallen?
Ihre Meinung

 Buchtipps
Zum Rheinwerk-Shop: Linux-Server






 Linux-Server


Zum Rheinwerk-Shop: Das Komplettpaket LPIC-1 & LPIC-2






 Das Komplettpaket
 LPIC-1 & LPIC-2


Zum Rheinwerk-Shop: Linux-Hochverfügbarkeit






 Linux-
 Hochverfügbarkeit


Zum Rheinwerk-Shop: Shell-Programmierung






 Shell-
 Programmierung


Zum Rheinwerk-Shop: Linux Handbuch






 Linux Handbuch


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
Info





Copyright © Rheinwerk Verlag GmbH 2006
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern