Interrupt recv()

Interrupt recv()
2011-07-04T16:27:58+02:00
2011-07-06T10:01:43+02:00
2022-11-22T10:05:46+01:00
szaboben
Sziasztok!

Platform: Windows
Cben egy olyan feladatot kell megodanom, hogy client-server kapcsolatban (via SCTP) ha a server bontja a kapcsolatot, akkor a client oldalon a receiver thread normalisan alljon le, hogy a memoriafelszabaditast stbstb el tudjuk intezni azon a szalon is. A problema ott van, hogy kapcsolat bontasakor a recv(...) fv - amit elvileg hasznal az sctp_recvmsg(...) fv is - blokkolja a szalat, es nem szakad meg, nem all le hibauzenettel stb, hanem az a szal ez a blokkolas miatt a program futasanak a vegeig ott el a memoriaban.

Ez az ut nem mukodik:
Fogado szal:
for (;;) { printf(" //pthread_testcancel();\n"); pthread_testcancel(); // thread cancellation point printf(" //receiveMessage(...);\n"); receiveMessage(conn); printf(" //End of the cycle\n"); }
Leallito resz:
if (conns[i].receiver_thread != NULL) { retval = pthread_cancel(*conns[i].receiver_thread); if (retval) { printf("Stopping: conns[%d].receiver_thread... - already stopped!\n", i); } else { printf("Interrupting: conns[%d].receiver_thread...\n", i); pthread_kill(*conns[i].receiver_thread, SIGINT); printf("Done\n", i); } }

SCTP driver: bluestop

Van valami otletetek, hogy hogyan lehetne megoldani?
Nem tudom, esetleg van a Cben arra lehetoseg, hogy ugy, ahogy van, tok brutalis es durva modon leallitsak es kinyirjak egy szalat - ami mukodne ebben az esetben is?

Elore is koszi a segitsegeteket! :)
Mutasd a teljes hozzászólást!
Háát, nagy nehezen sikerült megoldani a dolgokat.

Thread legyilkolásában köszönöm a segitségedet, arra szükség volt. Viszont a többi problémára az adott megoldást, hogy újabb sctp drivert telepitettem fel, mert a régebbiben több dolog - köztük a sima select - nem működött rendesen.
Mutasd a teljes hozzászólást!

  • Amikor én próbálkoztam a pthread_cancellel C++ alatt, csak a szívás volt vele. C++-ban tudtommal a cancel egy kivétel dobásával van megvalósítva, viszont a normál destruktoros takarítás problémákba ütközik, mert bármilyen I/O-val próbálkozol, az is csak visszadobja neked a cancel exceptiont és nem végzi a dolgát. (Mondjuk ez Linux alatt volt, nem Windows alatt.) Ha meg nem ez a gond, akkor az, ami most nálad is van, hogy a cancel nem állít meg valamit.

    Két lehetőség adódik szerintem:
    1. Fix timeouttal várakozol az adatokra, és visszatérés után mindig nézed a cancel flaget (lehetőleg ne a pthread-eset, hanem egy sajátot, ami nem hajigál kivételeket). Ha Windows-specifikus megoldás is szóba jöhet, akkor a WaitForMultipleObjects függvénnyel várhatsz egyszerre a socketre és egy cancel eventre. (Ez a függvény kb. a select() vagy a poll() windowsos megfelelője.)
    2. Ha a túloldal szabályosan zárta le a saját végén a kapcsolatot, akkor elvileg a recv() nem vár a végtelenségig, hanem ad neked egy jól definiált jelzést, hogy itt a stream vége. Ha lehetséges, szebb a streamen belül "letárgyalni", hogy vége a kommunikációnak, nem csak úgy lezárni a kapcsolatot.

    Ha mindenképpen szálat akarsz gyilkolni, használhatod a Windows TerminateThread függvényét, de nem tudom, mennyire fogja tolerálni ezt a pthreads. Ez már csak azért sem ajánlatos, mert a szál nem tud takarítani maga után, ami minimum memory leaket fog okozni, de rosszabb esetben deadlockot is, ha épp valami lockot fogott a szál, amikor elkaszáltad.
    Mutasd a teljes hozzászólást!
  • Annyit elirtam, hogy akkor all fenn ez a problema, ha a client bontja a kapcsolatot es ebben az esetben a client oldali receiver szal nem all le, hanem folyamatosan varja, hogy olvasson valamit - a mar lezart kapcsolaton, ugyanis wiresharkkal lehet latni, hogy a shutdownt normalisan lekomunikaljak.
    Faradt voltam, elnezest :)
    Mutasd a teljes hozzászólást!
  • Ugy tunik, a TerminateThread segitsegevel jol le tudom gyilkolni a szalat, de valoban ez egy veszelyesebb megoldas - de elfogadhato. Meg probalkozom a masik otleteddel, amit elore is koszonok :)
    Mutasd a teljes hozzászólást!
  • Háát, nagy nehezen sikerült megoldani a dolgokat.

    Thread legyilkolásában köszönöm a segitségedet, arra szükség volt. Viszont a többi problémára az adott megoldást, hogy újabb sctp drivert telepitettem fel, mert a régebbiben több dolog - köztük a sima select - nem működött rendesen.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd