Wpis z mikrobloga

#cpp #winsock Dzień dobry. Chciałem się zapytać o gniazda, ponieważ utknąłem na odbieraniu danych. Program działa "prawie" jak serwer www: przyjmuje dane i odsyła do przeglądarki 200 OK + nagłówki od CORS (dlatego prawie, nie potrzebne mi jest parsowanie urli, wywoływanie php itd). Obecnie gniazdo ustawione jest na nieblokowalne i pojawia się problem w tym, że od czasu do czasu zaraz po nawiązaniu połączenia recv() przyjmuje wartość -1, a wsa rzuca numerkiem mówiącym, że "WSAEWOULDBLOCK". Czy mógłby mnie ktoś naprowadzić na prawidłowe rozwiązanie?
  • 3
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@januzi: po pierwsze to robienie tego na nieblokujących socketach to złe podejście.
WSAEWOULDBLOCK mówi o tym że operacja się jeszcze nie skończyła. po prostu ignorujesz i czekasz aż się skończy.

Resource temporarily unavailable. This error is returned from operations on nonblocking sockets that cannot be completed immediately, for example recv when no data is queued to be read from the socket. It is a nonfatal error, and the operation should
  • Odpowiedz
@ly000: Czekać, czyli lecieć z while aż pojawią się dane?

Może i racja z blokowaniem. Tylko jedno pytanie dodatkowo: czy OPTIONS oraz POST mają iść na tym samym gnieździe? Czy raczej odbieramy OPTIONS, odsyłamy przeglądarce nagłówki jakich chce i się rozłączamy?
  • Odpowiedz
@ly000: Dziękuję :) Debilem jestem :P Tylko tak dla pewności: robimy retval = recv(), sprawdzamy w otrzymanym buforze jakie są nagłówki html i wyciągamy (int)content-length, jak tylko suma retval będzie większa niż content-length to odsyłamy własne nagłówki html razem z body i robimy shutdown(socket). Zgadza się?
  • Odpowiedz