Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

Verbindungsloser Client

&pagelevel(3)&pagelevel

In diesen Programmbeispielen verwendet der Client die folgenden Funktionen der Socket-Schnittstelle:

  • socket(): Socket erzeugen

  • gethostbyname() / getipnodebyname(): Rechner-Eintrag abfragen

  • sendto(): Nachricht an einen Socket senden

  • soc_close(): Socket schließen

  
Beispiel: Verbindungsloser Client bei AF_INET

#include <stdio.h>
#include <sys.types.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 TESTPORT 2222
  
/*
 * Dieses Programm sendet ein Datagramm an einen Empfänger, dessen Name als 
 * Argument in der Kommandozeile übergeben wird. 
*/
main(argc,argv)
    int argc;
    char *argv[];
{
    int sock;
    struct sockaddr_in to;
    struct hostent *hp, *gethostbyname();
   
    /* Erzeugen des Sockets, an den gesendet werden soll. */
    sock = socket(AF_INET, SOCK_DGRAM, 0);
    if (sock < 0 )
       { perror("Socket datagram");
         exit(1);
       }
  
    /* Konstruieren des Namens des Sockets, an den gesendet werden soll, 
     * ohne Verwendung von Wildcards. gethostbyname liefert eine Struktur, 
     * die die Netzadresse des angegebenen Rechners enthält.
     * Die Portnummer wird aus der Konstante TESTPORT entnommen.
     */
    hp =gethostbyname(argv[1]);
    if (hp == 0) {
        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, &to, sizeof to) < 0) {
         perror("Sending datagram message");
         exit(1);
    }
    soc_close(sock);
}

Beispiel: Verbindungsloser Client bei AF_INET6

#include <stdio.h>
#include <sys.types.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 TESTPORT 2222
  
/*
* Dieses Programm sendet ein Datagramm an einen Empfänger, dessen Name als
* Argument in der Kommandozeile übergeben wird. */
main(argc,argv)
    int argc;
    char *argv[];
{
    int sock;
    int error_num;
    struct sockaddr_in6 to;
    struct hostent *hp;
  
    /* Erzeugen des Sockets, an den gesendet werden soll. */
    sock = socket(AF_INET6, SOCK_DGRAM, 0);
    if (sock < 0 )
       { 
         perror("Socket datagram");
         exit(1);
       }
    /* Konstruieren des Namens des Sockets, an den gesendet werden soll,
    * ohne Verwendung von Wildcards. gethostbyname liefert eine Struktur,
    * die die Netzadresse des angegebenen Rechners enthält.
    * Die Portnummer wird aus der Konstante TESTPORT entnommen.
    */
    hp =getipnodebyname(argv[1], AF_INET6, 0, &error_num);
    if ((hp = = 0) || (error_num != NETDB_SUCCESS))
       {
         fprintf(stderr, "%s:unknown host\n", argv[1]);
         exit(1);
       }
    memcpy((char *)&to.sin6_addr, (char *)hp->h_addr,hp->h_length);
    to.sin6_family = AF_INET6;
    to.sin6_port = htons(TESTPORT);
   
    /* Freigabe des dynamischen Speichers von hostent */
    freehostent(hp);
  
    /* Nachricht senden. */
    if (sendto(sock, DATA, sizeof DATA, 0, &to, sizeof to) < 0) 
       {
         perror("Sending datagram message");
         exit(1);
       }
    soc_close(sock);
}


In den Programmbeispielen zu AF_INET und AF_INET6 werden folgende Arbeitsschritte durchgeführt:

  1. Der Client erzeugt mit socket() einen Kommunikationsendpunkt (Socket) und den zugehörigen Deskriptor.
  2. Mit gethostbyname() fragt der Client die Adresse des Rechners ab (bei AF_INET); es wird der Rechnername als Parameter übergeben.
    Mit getipnodebyname() fragt der Client die IPv6-Adresse des als Parameter übergebenen Rechnernamens ab. DIese neue Funktion könnte auch für das AF_INET Beispiel verwendet werden.
    Danach wird die Adress-Struktur initialisiert.

  3. Mit sendto() sendet der Client ein Datagramm. sendto() liefert die Anzahl der übertragenen Zeichen zurück.

  4. Mit soc_close() schließt der Client den Socket.