|
From: Ondrej P. <oc...@ma...> - 2002-12-29 17:42:01
|
mscc> Cau, udelal jsem cast testu na posilani zprav mscc> - ale kdyz jsem si s tim hral, tak jsem narazil mscc> na par problemu: mscc> - Pokud server zacne po navazani spojeni posilat mscc> UDP zpravy driv, nez dostane nejakou (UDP) mscc> zpravu od klienta, tak to poradne nefunguje. mscc> S TCP zpravami problem neni. Zkus se na to taky mscc> mrknout, to pripojovani jsi psal ty, takze bys mscc> do nej mel lip videt nez ja. Dokonce v takovem mscc> pripade ani klient neodesle svoje zpravy... mscc> Pri ladeni jsem zjistil, ze server ty UDP zpravy mscc> normalne odesle, klientovi do socketu _neco_ mscc> prijde - ale to neco ma vzdycky delku 1. Klient mscc> pak porad dokola kouka na ten UDP socket a zrejme mscc> se z toho tak vzrusi, ze uz ani nic neodesle... mscc> Abys tuhle situaci vyvolal, nahrad v mscc> netserver_test.cpp ve funkci network_traffic_tests mscc> prvni radek mscc> while( current_time < ( loop_begin + 5 ) ) mscc> radkem mscc> while( current_time < ( loop_begin + 1 ) ), mscc> popr. (pokud by to nenastalo) mscc> while( current_time < ( loop_begin ) ) Na tohle se podivam, neco me napada, ale jeste si nejsem jisty. mscc> Jo, a necommituj zadne zmeny v mych funkcich mscc> v net(server|client)_test.(cpp|h) - jinak to mscc> pak nezmergujem dohromady! No nejake zmeny udelat musim, treba ted delam neco s loggerem, tak snad to nebude problem zmergovat, je toho malo. mscc> - Je urcite dobre UDPSocketxxx::receive_data? mscc> Moc nechapu, proc funguji radky mscc> recvbuf.resize( j ); mscc> // looks ugly hehe, works well. mscc> recvbuf.resize( mscc> ::recvfrom( mscc> sock, mscc> ( char * ) recvbuf.get_buffer(), mscc> j, 0, &ra, &ra_size mscc> ) mscc> ); Pr. na socketu jsou 3 UDP packety, velikost bytu je 100b j ma hodnotu 100, ale tim, ze zavolam recv, prijmu jenom prvni packet, ktery je kratsi, aby dobre fungovala statistika a UDP checksum, je potreba aby recvbuf byl stejne velikosti, jako prijata data. Na zacatku ho nastavim na velikost vsech dat na socketu ( nevim, kolik je tam UDP packetu, treba jen jeden ... ) a pak to podle potreby resiznu. Ja si myslim, ze je to spravne. Kazdopadne si muzes vyzkouset, ze bez toho druheho resize to nebude fungovat... mscc> Kdyt prece parametry se vyhodnocuji nejdriv, mscc> takze nejdriv se zapise do bufferu, a pak mscc> se teprve ten buffer resizne? Navic - proc tam mscc> je 2x resize hned po sobe? mscc> A jeste ve stejne funkci: mscc> ::recvfrom( sock, NULL, j, 0, &ra, &ra_size ); mscc> Co to ma delat? O tom, ze by vystupni buffer mscc> mohl mit hodnotu NULL jsem v dokumentaci nic mscc> nenasel. To je ok, pokud na ten UDP socket prisel nejakej packet, kterej je kratsi nez prazdnej message, tak to proste zahodi. mscc> Tak se na to mrkni, moc se mi nechce psat dalsi mscc> testy nebo tyhle rozsirovat, dokud tohle neodhalime... mscc> Marek Octa -- Best regards, Ondrej mailto:oc...@ma... |