In diesem Programmbeispiel verwendet der Client die folgenden Funktionen der Socket- bzw. POSIX-Schnittstelle:
socket(): Socket erzeugen
gethostbyname(): Rechner-Eintrag abfragen
sendto(): Nachricht an einen Socket senden
close(): Socket schließen
Beispiel: Verbindungsloser Client
#include <stdio.h> #include <sys/socket.h> #include <ioctl.h> #include <signal.h> #include <netinet/in.h> #include <netdb.h> #define DATA " The sea is calm, the tide is full ..." #define ERROR_EXIT(M) perror(M); exit(1) #define TESTPORT 2222 int main(int argc, char **argv) { int sock; struct sockaddr_in to; struct hostent *hp; /* Erzeugen des Client-Sockets, von den gesendet werden soll. */ if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { ERROR_EXIT("socket"); } /* Konstruieren des Namens des Server-Sockets, an den gesendet werden soll. */ if ((hp =gethostbyname(argv[1])) == NULL) { fprintf(stderr, "%s: unknown host\n", argv[1]); exit(1); } memcpy((char *)&to.sin_addr, (char *)hp->h_addr,hp->h_length); to.sin_family = AF_INET; to.sin_port = htons(TESTPORT); /* Nachricht senden. */ if (sendto(sock, DATA, sizeof DATA, 0, (struct sockaddr *)&to, sizeof to) < 0) { ERROR_EXIT("sendto"); } close(sock); return 0; }
Im Programm werden folgende Arbeitsschritte durchgeführt:
Die Funktion socket() erzeugt einen Kommunikationsendpunkt (Client-Socket) und den zugehörigen Deskriptor.
Mit gethostbyname() wird die IP-Adresse des Servers ermittelt; der Rechnername wird als Parameter beim Programmaufruf übergeben.
Danach wird die Server-Adress-Struktur initialisiert.
Die Funktion sendto() sendet vom Client-Socket ein Datagramm an den Server-Socket. Sie liefert die Anzahl der übertragenen Zeichen zurück.
Die Funktion close() schließt den Client-Socket.
Das Beispielprogramm ist nur für die Kommunikationsdomäne AF_INET gültig. Wenn es gemäß den Angaben in "Socket- Adressierung" und "Socket erzeugen" geändert wird, gilt es auch für die Domäne AF_INET6. Beachten Sie auch, dass Sie die Socket-Funktionen getaddrinfo() oder getipnodebyname() anstelle von gethostbyname() verwenden.