Jsem zoufaly, neidentifikovatelna chyba v programu v C

Pavel Kankovsky peak na argo.troja.mff.cuni.cz
Čtvrtek Květen 25 10:47:07 CEST 2000


On Thu, 25 May 2000, Luboš Mikulec wrote:

> Nasledujici program ma za ulohu poslat pomoci UDP protokolu na urcity port
> nekolik desitek byte a pockat 3 sekundy na odpoved.
> 
> Problem je v tom, ze staci prehodit poradi v deklaraci promennych a pak

Byvalo by nebylo od veci, kdybyste rekl, jak ho staci prehodit.
Ostatne mozna by bylo nejlepsi, kdybyste vsechny promenne sendvicove
prolozil promennymi past1...pastN, ktere inicializujete na nejake
netrivialni hodnoty, a pak budete metodou puleni kodu hledat, kde dojde
k neocekavane zmene tech hodnot.

> nefunguje korektne, napr. neprobehne BIND(), nebo SENDTO(),

To, ze neprobehne bind() by take mohlo byt tim, ze adresa je stale jeste
obsazena po predchozim spusteni programu (u TCP to bez SO_REUSEADDR dela
a myslim, ze u UDP taky, ale nejsem si uplne jisty).

> nebo v RECFROM naplni strukturu RECV nesmyslnimu udajmi.

Jakou strukturu RECV? Myslite sin_recv?

> Poradte prosim.

Zatim bych mel jen par pripominek, ktere ten problem asi neresi... :)

> void main(void)

Funkce main() by mela vzdy vracet int.

>     bytes = sendto(sock, message, message_len,0,
>              (struct sockaddr*) & sin_server, size_server); 

Ted nevim...je mozne, aby to poslalo jen cast?

>     retval=select(sock+1,&rfds,NULL,NULL,&tv);

>     if (retval)
>     {

select() muze vratit i -1

>         bytes = recvfrom(sock, reply, 512, 0,
>                   (struct sockaddr*) &sin_recv,&size_recv);

Bylo by lepsi, kdybyste misto 512 napsal sizeof(reply), nebo jeste lepe
sizeof(reply-1) (viz nize).

BTW: Je zcela irelevantni, jestli pred reply je ampersand nebo neni. Kdyz
je tam jen reply, tak je to hodnota typu char[512], a ta se konvertuje na
ukazatel (void *) tak, ze se vezme adresa nulteho prvku (&reply[0]). Kdyz
je tam &reply, tak tam bude hodnota typu char(*)[512], coz uz je ukazatel,
a tudiz se to preda primo, ale adresa celeho pole je vzdy stejna, jako
adresa jeho nulteho prvku.

>         reply[bytes]=0;

Prijde-li odpoved dlouha presne 512 bajtu, pak tohle bude zapisovat
za hranice pole reply. Nejspis si to prepise stack frame a spadne na usta.

>     close(sock);
> }

Funkce main() by mela vzdy koncit return nebo explicitnim exit()
(to souvisi s tim typem navratove hodnoty).

--Pavel Kankovsky aka Peak  [ Boycott Microsoft--http://www.vcnet.com/bms ]
"Resistance is futile. Open your source code and prepare for assimilation."






Další informace o konferenci Linux