Loading...
Select Version
&pagelevel(3)&pagelevel
Das folgende Client-Programm im verbindungsorientierten Dienst ist im Abschnitt "Verbindungsorientiertes Client/Server-Modell" näher erläutert. Der Client baut eine Transportverbindung mit einem Server auf, erhält dann Daten vom Server und schreibt die Daten auf seine Standardausgabe. Die Verbindung wird mit dem geordneten Verbindungsabbau der Transportschnittstelle aufgelöst. Der Client kann mit jedem in den Beispielen dieses Kapitels vorgestellten verbindungsorientierten Server kommunizieren.
#include <stdio.h> #include <xti.h> #include <fcntl.h> #include <netinet/in.h> #include <sys/socket.h> #define SRV_ADDR 0x7F000001 #define SRV_PORT 8888 main() { int fd; int nbytes; int flags = 0; char buf[1024]; struct t_call *sndcall; struct sockaddr_in *sin; if ((fd = t_open("/dev/tcp", O_RDWR, NULL)) < 0) { t_error("t_open() gescheitert"); exit(1); } if (t_bind(fd, NULL, NULL) < 0) { t_error("t_bind() gescheitert"); exit(2); } if ((sndcall = (struct t_call *)t_alloc(fd,T_CALL, T_ADDR)) == NULL) { t_error("t_alloc() gescheitert"); exit(3); } sndcall->addr.len=sizeof(struct sockaddr_in); sin = (struct sockaddr_in *)sndcall->addr.buf; sin->sin_family=AF_INET; sin->sin_port=htons(SRV_PORT); sin->sin_addr.s_addr=htonl(SRV_ADDR); if (t_connect(fd, sndcall, NULL) < 0) { t_error("t_connect() gescheitert für fd"); exit(4); } while ((nbytes = t_rcv(fd, buf, 1024, &flags)) != -1) { if (fwrite(buf, 1, nbytes, stdout) == 0) { fprintf(stderr, "fwrite() gescheitert\n"); exit(5); } } if ((t_errno == TLOOK) && (t_look(fd) == T_ORDREL)) { if (t_rcvrel(fd) < 0) { t_error("t_rcvrel() gescheitert"); exit(6); } if (t_sndrel(fd) < 0) { t_error("t_sndrel() gescheitert"); exit(7); } exit(0); } t_error("t_rcv() gescheitert"); exit(8); }