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...
Ř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?
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.
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?