Hlavní navigace

Vlákno názorů k článku Sokety a C/C++: datagramy a PF_UNIX od Dalxo - Chcem sa spytat autora clanku, ci skusal pracovat...

  • Článek je starý, nové názory již nelze přidávat.
  • 8. 10. 2003 14:23

    Dalxo (neregistrovaný)

    Chcem sa spytat autora clanku, ci skusal pracovat so soketmi cisto objektovym pristupm. Mam na mysli ci skusal napisat si C++ program, ktory napr. posiela UDP segmenty...

    Asi nie, pretoze by to nenazval C/C++ a sokety... skuste si to zabalit do objektu, prekompilot s C++ a uvide tu srandu. Nakoniec zistite, ze to neprekompiluje. NAto, aby som mohol vytvorit soket na UDP a posielat broadcasty, som musel pouzit toto:

    if( (sd = socket(PF_INET, SOCK_DGRAM, 0)) == -1 )
    {
    fprintf(stderr, "Error, cannot create socket\n");
    return;
    }

    if( setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) == -1 )
    {
    fprintf(stderr, "Error: setsockopt: \"%s\"\n", strerror(errno));
    close( sd );
    return;
    }


    struct sockaddr_in *sock = new struct sockaddr_in();
    sock->sin_family = PF_INET;
    sock->sin_addr.s_addr = htonl(INADDR_ANY);
    sock->sin_port = htons( port );
    addr = reinterpret_cast<struct sockaddr*>(sock);
    if( bind(sd, addr, sizeof(struct sockaddr_in)) == -1 )
    {
    fprintf(stderr, "Error: bind: \"%s\"\n", strerror(errno));
    close( sd );
    return;
    }

    if( setsockopt(sd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on)) == -1 )
    {
    fprintf(stderr, "Error: setsockopt: \"%s\"\n", strerror(errno));
    close( sd );
    return;
    }

    ---------------

    Chcem upozornit hlavne na tuto haluz:
    addr = reinterpret_cast<struct sockaddr*>(sock);

    bez tohto vam to urcite nepoujde, tak prosim nenazyvat tento serial tak odvazne, ze C/C++ ale radsej iba C...

  • 13. 10. 2003 11:38

    Radim Dostál (neregistrovaný)

    Řekl bych, že odvážené by bylo nazvat to jen C, protože většina příkladů v C nejde přeložit. Nejsou v C napsány. Používají neobjektová rozšíření C++ oproti C.
    Myslel jsem, že připomínky ohledně C/C++ už dávno skončily. Zvláště když jsem přesvědčen, že na tom nadpisu vůbec nezáleží.

    A jinak jsem nějak nepochopil ten příspěvek. Jako že mám přetypovávat pomocí reinterpret_cast? Podlě mě je to v mých příkladech zbytečné. Navíc bych řekl, že i tento kousek zdrojového textu by měl jít i bez reinterpret_cast.
    V jakém překladači to nešlo?

  • 13. 10. 2003 14:55

    Dalxo (neregistrovaný)

    To si uz presne nepamatam, ale bolo to tak pred 10 mesiacmi, najskuor gcc 2.96, ale nie som si totalne a uplne isty.

    Bez toho reinterpret cast to vuobec nechcelo skompilovat. Lama som si nad tym dost hlavu a potom som vygooglil nejaky kusok kodu, kde to bolo napisane, tak som to pouzil a uz to fungovalo.

  • 14. 10. 2003 15:01

    Dalxo (neregistrovaný)

    Zabudol som dodat, ze hore uvedeny kod je sucast inicializacnej metody jednej triedy, teda nemal som ho len tak "nasucho" :-)), ale zase som nechcel "vypastovat" cely zdrojak.

  • 14. 10. 2003 21:28

    Radim Dostál (neregistrovaný)

    Opravdu tam nejde místo

    addr = reinterpret_cast<struct sockaddr*>(sock);

    dát

    addr = (struct sockaddr*) sock;

    (i když to první je v C++ správnější)

    C++ přináší oproti C nové operátory pro přetypování. dynamic_cast, static_cast a reinterpret_cast. Zatímco použití dynamic_cast a static_cast je poměrně jasné, reinterpret_cast by se dal mnohokrát nahradit klasickým přetypováním z C. Podle normy by se asi měl používat reinterpret_cast, mně se ale v některých případech jeví jako zbytečný. Dost mě překvapuje, že gcc 2.96 by odmítalo "staré" přetypování. Nebyla tam chyba někde jinde?