next up previous contents index
Next: Über dieses Dokument ... Up: Multimediaübertragungen Previous: senddata.c

  
recvdata.c

/*
 * recvdata.c
 * Daten ueber einen socket empfangen und auf stdout ausgeben
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/socket.h>
#include <netdb.h>

#include "defs.h"

void
Usage(char *name)
{
        fprintf(stderr, "Aufruf: %s [-t] adresse port\n", name);
        fprintf(stderr, "\t -t: TCP verwenden\n");
        exit(1);
}
        
int
main(int argc, char **argv)
{
        int sock, err, bytesRead, ch, i, debug=0;
        char buf[PACKETSIZE];
        char *hostName, *portName;
        struct addrinfo hints, *address;
        int socketType = SOCK_DGRAM;

        while((ch = getopt(argc, argv, "dt")) != EOF) {
                switch(ch) {
                case 't':       socketType = SOCK_STREAM;
                                break;
                case 'd':       debug = 1;
                                break;
                default:        Usage(argv[0]);
                }
        }

        if(argc - optind != 2)
                Usage(argv[0]);

        hostName = argv[optind++];
        portName = argv[optind++];

        memset(&hints, 0, sizeof(struct addrinfo));

        hints.ai_socktype = socketType;
        hints.ai_flags = (AI_CANONNAME | AI_PASSIVE);

        err = getaddrinfo(hostName, portName, &hints, &address);
        if(err != 0) {
                fprintf(stderr, "getaddrinfo(): %d\n", err);
                exit(1);
        }

        sock = socket(address->ai_family, address->ai_socktype,
                address->ai_protocol);
        if(sock < 0 ) {
                perror("socket()");
                exit(1);
        }

        if(bind(sock, address->ai_addr, address->ai_addrlen) < 0) {
                perror("bind()");
                exit(1);
        }

        if(socketType == SOCK_STREAM) {
                struct sockaddr cliAddr;
                int newSock, cliAddrLen = sizeof(cliAddr);

                if(listen(sock, 5) == -1) {
                        perror("listen()");
                        exit(1);
                }
                newSock = accept(sock, &cliAddr, &cliAddrLen);
                if(newSock == -1) {
                        perror("accept()");
                        exit(1);
                }
                sock = newSock;
        }

        i = 0;
        while((bytesRead = read(sock, buf, sizeof(buf))) > 0) {
                fwrite(buf, bytesRead, 1, stdout);
                if(debug) {
                        if(++i % 10 == 0) {
                                fputc('.', stderr);
                                fflush(stderr);
                        }
                }
        }

        if(bytesRead < 0) {
                perror("read()");
                exit(1);
        }

        return 0;
}



Andreas Godzina
1999-04-06