Your Browser is not longer supported

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

{{viewport.spaceProperty.prod}}

Datagramm-orientierter Transaktionsserver

&pagelevel(3)&pagelevel

Das folgende Programm für ein Auftragssystem im verbindungslosen Modus ist im Abschnitt "Verbindungsloser Dienst am Beispiel eines Auftragssystems" näher erläutert. Der Server wartet auf eingehende Aufträge für Datenpakete, behandelt dann jeden Auftrag und sendet eine Antwort.

#include <stdio.h>
#include <fcntl.h>
#include <xti.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define SRV_ADDR 0x7F000001
#define SRV_PORT 8888
main()
{
   int fd;
   int flags;
   struct t_bind *bind;
   struct t_unitdata *ud;
   struct t_uderr *uderr;
   struct sockaddr_in *sin;
   if ((fd = t_open("/dev/udp", O_RDWR, NULL)) < 0) {
      t_error("Öffnen von /dev/udp nicht möglich");
      exit(1);
   }
   if ((bind = (struct t_bind *)t_alloc(fd,
      T_BIND, T_ADDR)) == NULL) {
      t_error("t_alloc() der t_bind-Struktur gescheitert");
      exit(2);
   }
   bind->addr.len=sizeof(struct sockaddr_in);
   sin=(struct sockaddr_in *)bind->addr.buf;
   sin->sin_family=AF_INET;
   sin->sin_port=htons(SRV_PORT);
   sin->sin_addr.s_addr=htonl(SRV_ADDR);
   bind->qlen = 0;
   if (t_bind(fd, bind, bind) < 0) {
      t_error("t_bind() gescheitert");
      exit(3);
   }
   if ((ud = (struct t_unitdata *)t_alloc(fd,
      T_UNITDATA, T_ALL)) == NULL) {
      t_error("t_alloc() von t_unitdata-Structur gescheitert");
      exit(5);
   }
   if ((uderr = (struct t_uderr *)t_alloc(fd,
      T_UDERROR, T_ALL)) == NULL) {
      t_error("t_alloc() von t_uderr-Structur gescheitert");
      exit(6);
   }
   for(;;) {
      if (t_rcvudata(fd, ud, &flags) < 0) {
         if (t_errno == TLOOK) {
                  /*
                   * Fehler wegen vorherigem Datagramm
                   */
                  if (t_rcvuderr(fd, uderr) < 0) {
                     t_error("t_rcvuderr() gescheitert");
                     exit(7);
                  }
                  fprintf(stderr, 
                  "Datagramm-Fehler, error = %d\n", 
                  uderr->error);
                  continue;
         }
         t_error("t_rcvudata() gescheitert");
         exit(8);
      }
      /*
       * query() bearbeitet den Auftrag und schreibt die
       * Antwort in ud->udata.buf und die Länge in ud->udata.len
       */
      query(ud);
      if (t_sndudata(fd, ud, 0) < 0) {
         t_error("t_sndudata() gescheitert");
         exit(9);
      }
   }
}
query()
{
/* aus Vereinfachungsgründen nur ein Abschnitt */
}