Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: programmer 14. 04. 2011, 12:19:11

Název: Server naslouchající na UDP a TCP
Přispěvatel: 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:
Kód: [Vybrat]
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);
}
}
Název: Re: Server naslouchajici na UDP a TCP
Přispěvatel: Sten 14. 04. 2011, 13:26:22
Ten fdset pro select naplňujete jenom jednou, po úspěšném selectu tak v něm je jenom selectovaný file descriptor.
Název: Re: Server naslouchajici na UDP a TCP
Přispěvatel: programmer 14. 04. 2011, 14:18:01
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.