broadcast funzt net



  • morgen

    ich eigne mir grad den stevens an und mache nach jedem kapitel ein porgrämchen um das geteste zu lernen. erstmal wollte ich nur das programm vom buch ausprovieren aber selbst das geht nicht

    ich habe die funktion dg_cli vom broadcast kapitel genommen und einen anderen echo client und die ganze geschichte so umgebaut das es funzt

    ich habe 2 daytime server gestartet. wenn ich sie mit

    ./a.out 192.168.0.1
    s
    from : Tue Jan 13 20:11:32 200
    ./a.out 192.168.0.133
    s
    from : Tue Jan 13 20:11:32 200

    das geht beides. mache ich aber nun den sinn der sache, nähmlich den bcast, kommt

    ./a.out 192.168.0.255
    a
    Broken pipe

    der code

    #include "unp.h"
    
    void dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen);
    static void     recvfrom_alarm(int);
    
    int
    main(int argc, char **argv)
    {
      int         sockfd;
    
      struct sockaddr_in    servaddr;
    
      if (argc != 2){
       puts("usage: tcpcli <IPaddress>"); exit(0);}
    
      sockfd = socket(AF_INET, SOCK_STREAM, 0);
    
      bzero(&servaddr, sizeof(servaddr));
      servaddr.sin_family = AF_INET;
      servaddr.sin_port = htons(13);
      inet_pton(AF_INET, argv[1], &servaddr.sin_addr);
    
      connect(sockfd, (SA*) &servaddr, sizeof(servaddr));
    
      dg_cli(stdin, sockfd, (SA*) &servaddr, sizeof(servaddr));
    
      exit(0);
    }
    
    void
    dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)
    {
            int                             n;
            const int               on = 1;
            char                    sendline[MAXLINE], recvline[MAXLINE + 1];
            socklen_t               len;
            struct sockaddr *preply_addr;
    
            preply_addr = malloc(servlen);
    
            setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));
    
            while (fgets(sendline, MAXLINE, fp) != NULL) {
            sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);
    
                    for ( ; ; ) {
                            len = servlen;
                            n = recvfrom(sockfd, recvline, MAXLINE, 0, preply_addr, &len);
    puts("test");
                            if (n < 0) {
    
                                    if (errno == EINTR)
                                            break;          /* waited long enough for replies */
                                    else {
                                            //err_sys("recvfrom error");
           puts("recverror"); exit(0); }
                            }
    
        if ( n == 0) exit(0);
    
          else {
                                    recvline[n] = 0;        /* null terminate */
    
         printf("from %s: %s", preply_addr->sa_data, recvline);
                            }
                    }
            }
    }
    

    danke 🙂



  • achja hab herausgefunden das höchstwahrscheinlich das

    sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);

    die Broken Pipe auslöst



  • hat sich erledigt danke 🙂


Anmelden zum Antworten