Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: programmer 14. 04. 2011, 12:19:11
-
Vytvarim aplikaci serveroveho typu, ktera nasloucha na UDP i TCP portu soucasne (jeden port). Nastal problem pri prijmu dat a nevim jak ho vyresit.
Kdyz server komunikuje pouze pres jeden typ protokolu, vse je ok. Problem nastava, kdyz zacnou chodit pozadavky a kombinuji se oba protokoly.
Presneji: Pokud je prvni pozadavek pres protokol TCP, UDP uz nefunguje. Funguje pouze TCP. Stejne tak to plati opacne. Vzdy jakoby se vybral jeden typ protokolu a druhy zablokoval.
Ukazka kodu:
FD_ZERO(&set);
FD_SET(udp, &set);
FD_SET(tcp, &set);
while(1) {
if (select(MAX(udp,tcp)+1, &set, NULL, NULL, NULL) <= 0) {
// err ...
}
if (FD_ISSET(udp, &set)) {
n = recvfrom(udp, ptr, size, 0, (struct sockaddr *)&addr, &size2);
// ...
} else { // Puvodne byl zde if (FD_ISSET(tcp, &set)) { ..., ale chovalo se to stejne
int client = accept(tcp, (struct sockaddr *)&addr, &size2);
n = read(client, ptr, size);
// ...
close(sclnt);
}
}
-
Ten fdset pro select naplňujete jenom jednou, po úspěšném selectu tak v něm je jenom selectovaný file descriptor.
-
Ten fdset pro select naplňujete jenom jednou, po úspěšném selectu tak v něm je jenom selectovaný file descriptor.
Ok, fajn. Puvodne jsem mel nulovani a nastavovani mnoziny fd v cyklu, ale stejne se to chovalo divne, takze jsem si nebyl moc jisty. Ted uz zrejme vim, kde byl problem. Jeste vyresit jeden problem a mam to :). Diky.