Wysłanie komunikatu do rozłączonego gniazdka

0

Haj. Jest serwer komunikatora w C na linuksie oparty na gniazdkach, do którego podłączają się klienci. Wszystko jest cacy do momentu, gdy klient wyloguje się - nim komunikat o zerwaniu połączenia zostanie przetworzony, inni klienci od czasu do czasu zdążają wysłać komunikat na gniazdko, które zostało opuszczone, ale nie zostało to jeszcze "zauważone" przez serwer. Wysyłając na takie opuszczone gniazdko komunikat serwer strzela sobie samobója - zawiesza się. Gdyby to było C++, możnaby użyć wyjątków, ale C na to nie pozwala. Czy jest jakaś metoda żeby zabezpieczyć funkcję write przed rozłożeniem programu?

0

To sprawdzaj co zwraca write, jeśli < 0 to jest error i zamykasz wątek klienta, czy co tam masz. Chyba, że read zwraca Ci błąd, usuwasz deskryptor strumienia i write nie ma do czego się odwołać. Pokaż jak to robisz.

0

Write nic nie zwróci, bo zabija program. Gdy serwer "wie", że gniazdko zostało opuszczone, wówczas nie ma problemu, dostaję wartość = 0, ale jeśli klient się ulotni, a serwer o tym jeszcze nie wie, wówczas write na rzekomo aktywne gniazdko powoduje harakiri programu.
Edit:
Tak wygląda kawałek kodu wysyłającego dane:

er = write(*Gniazdo, &Naglowek, sizeof(Naglowek));

Jeśli zapisywane gniazdko jest już puste (a deskryptor jeszcze nic o tym nie wie), wartości er dostać nie może, bo program nie wraca z wywołania write'a - program jest tam przerywany bez jakiegokolwiek komunikatu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1