recvfrom() nie dzia

Potrzebujesz pomocy z C, C++, perl, python, itp.
pch0317
Posty: 22
Rejestracja: 13 marca 2009, 21:24

recvfrom() nie działa - podaje krótki kod źródłowy

Post autor: pch0317 »

Cześć.
Utworzyłem wątek. Wszystko się kompiluje.
W wątku tym odbieram wiadomości z gniazda, a raczej próbuję odbierać bo nie działa funkcja ,,recvfrom'' ponieważ zwraca ,,n<0'' co oznacza że wystąpił w niej błąd. Funkcja wątku wygląda tak:

Kod: Zaznacz cały

void InterfejsGniazdaPulapek::nasluch_i_odbior_pulapek()
{
   int gniazdoPulapek, n;         //tu przygotowuje zmienne glownie dla funkcji recvfrom
   struct sockaddr_in struktura, strukturaBind;
   char buforPulapek[1600];
   socklen_t wielkoscStrukturyPulapek;

   gniazdoPulapek = socket(AF_INET, SOCK_DGRAM, 0);         //tworze gniazdo UDP

   memset(&struktura, 0, sizeof(struktura));         //zeruje wstepnie struktury
   memset(&strukturaBind, 0, sizeof(strukturaBind));

   strukturaBind.sin_family = AF_INET;         //wypelniam strukture
   strukturaBind.sin_addr.s_addr = htonl(INADDR_ANY);
   strukturaBind.sin_port = htons(162);
   bind(gniazdoPulapek, (sockaddr *)&strukturaBind, sizeof(strukturaBind));   //binduje gniazdo


   for (; ;)
   {
      n = recvfrom(gniazdoPulapek, buforPulapek, sizeof(buforPulapek), 0, (sockaddr *)(&struktura), &wielkoscStrukturyPulapek);   //tu wlasnie funkcja recvfrom zwraca n<0

      if (n < 0)   //ten przypadek zachodzi i wyswietla   error n<0
         std::cout << std::endl << "error n<0";

      else   // to sie nie wykonuje
      {
       costam
      }
   }
}
Wcześniej odbieranie wiadomości działało i nie wiem dlaczego teraz nie chce pracować - toż to banalny fragment kodu. No ale swoich błędów się nie zauważa więc proszę o pomoc. Aha, ,,errno'' jeśli dobrze sprawdziłem wynosi 22 czyli ,,EINVAL''. Coś czytałem znalezionego przez Google o tym i kombinowałem ale nic nie pomogło.
Co jest nie tak?
ponton
Beginner
Posty: 406
Rejestracja: 24 stycznia 2007, 01:40
Lokalizacja: Kalisz/Wroc³aw

Post autor: ponton »

Przepraszam, ale tego postu nie da się czytać. Wyedytuj go i poraw, umieszczając kod w znacznik

Kod: Zaznacz cały

 i sprawdzając pisownię przed wysłaniem.

------

[url]http://www.opengroup.org/onlinepubs/007908775/xns/recvfrom.html[/url]

[EINVAL]
The MSG_OOB flag is set and no out-of-band data is available.
pch0317
Posty: 22
Rejestracja: 13 marca 2009, 21:24

Post autor: pch0317 »

No tak ale w funkcji recvfrom nie ma ustawionych zadnych flag bo jako czwarty argument podalem 0.
djstrong
Posty: 1
Rejestracja: 03 czerwca 2010, 22:06

Post autor: djstrong »

Też miałem z tym problem. Okazało się, że ostatni argument funkcji recvfrom musi być zainicjowany (dla rozmiaru struktury sockaddr działa).

Kod: Zaznacz cały

suac=sizeof(struct sockaddr_un);
 35       r=recvfrom(unixK, buf, SBUF, 0, (struct sockaddr *)&unix_addr_c,
    &suac);
ODPOWIEDZ