Portál AbcLinuxu, 11. května 2025 10:49
Dobry den, delam aplikaci komunikujici pres UDP sockety. Klient se dostane do teto situace: ceka na data od serveru ve funkci recvfrom() nad blokujim socketem. Aplikace (klient) tedy "stoji" a ceka na data od serveru.
Zaroven v klientovi bezi timer, ktery kdyz zjistit, ze server dlouho neodpovida (tzn. paket se nejspise ztratil), tak posle signal SIGALRM. Ted, ale prichazi muj dotaz: jak lze na signal zareagovat tak, aby klient prestal cekat ve funkci recvfrom() a zacal delat neco jineho (nejspis teda preposlani paketu serveru)?
Jo, to vypada dobre, zkusim to pouzit, zatim dekuji.
OK, tak jsem to zkusil, ale ten select ma jednu (z meho pohledu) chybku. Mne ten signal SIGALRM z timeru prichazi periodicky a vzdy se podiva, zda nahodou necekame na server jiz moc dlouho a pokud ano, nastavi urcitou promennou, ktera bude signalizovat, ze cekame moc dlouho. Jenze ted s tim selectem mi select "spadne" po prvnim prichodu signalu, i kdyz mi jeste zbyva cas, po ktery bych cekal. Jde tomuto nejak zabranit, nebo to vyresit? Dekuji.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.