/* * 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; }