Socket- wiadomość dochodzi, ale nie mogę jej odczytać

0

Sprawa wygląda tak:

  • łączę się z serwerem
  • tworzę wątek, w którym w pętli odbieram wszelkie wiadomości od serwera
  • w pewnym momencie zamykam ten wątek, wysyłam jedno zapytanie do serwera i już w głównym wątku aplikacji oczekuję na odpowiedź

Na Windowsie wszystko działało, ale zachciało mi się zabawić w Linuksa i staram się przepisać na niego tą aplikację.
Problem wygląda tak, że po wysłaniu tego ostatniego zapytania nie dostaję odpowiedzi. recv zwraca -1, a errno == 0. Natomiast sniffując aplikację okazuje się, że ostatnia odpowiedź dochodzi.

Wygląda to mniej więcej tak, po prostu:

	zatrzymajWatek = true;
	
	send(cos tam cos tam);
	
	recv(cos tam cos tam);

Socket ma ustawiony SO_RCVTIMEO na 5 sekund, w wątku: sprawdzam czy zatrzymajWatek == true, recv(), czekam 50μs. Próbowałem też przed wysyłaniem zabić wątek (pthread_kill). Bez skutku.
O co może chodzić?

0

Zatrzymywanie wątków zmienną to nie jest najlepszy pomysł.

0

Jest taka magiczna funkcja select() na linuxie, skorzystaj z niej :)

0

select() zwraca 0

0

To znaczy ze w określonym czasie na żaden deskryptor nie przyszła wiadomość. Daj za timeout NULL i zobacz czy problem jest z czasem czy z połączeniem.

0

Zarówno przed jak i po tym ostatnim odbieraniu, kiedy spróbowałem coś kontrolnego wysłać to wszystko dochodzi bez problemów.
Ale ten problem z odbieraniem jest większy, bo w innym miejscu używam callback'u, wygląda to mniej-więcej tak:

	recv(cos tam cos tam)
	recv(cos tam cos tam)
	if(callback != NULL)
		callback();
 

I teraz znowu, na Windowsie działa OK. Na Linuksie nie działa. Działa dopiero kiedy wywołanie callback'u umieszczę przed tym drugim recv. Mimo, że drugi recv odbiera poprawnie.

0

Trzeba będzie to bardziej skomplikować. Na Windowsie jakoś działało, a tu...
Teraz zrobiłem tak, że ustawiłem zarzymajWatek na true i czekałem (pthread_join) no i zadziałało, ale to czekanie jest za długie.
Jak humanitarnie, ale szybko ubić wątek tak, żebym miał pewność że nie zrobię tego podczas odbierania? Mutex? Czy i tak będę musiał czekać tyle, na ile jest ustawiony timeout?
Głupio by było, żeby user musiał czekać 5 sekund na zamknięcie aplikacji, bo taki timeout jest.

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