winsock2.h blokowanie recvfrom()

0

Pisze program do zdalnej kontroli komputera który działa w tle i w swoim programie mam taką pętle:

char buf[1024];
SOCKET sock;
sockaddr_in dest_addr;
int s=sizeof(sockaddr);
for(;;)
{
if (recvfrom(sock,buf,1024,0,(sockaddr*)&dest_addr,&s)!=-1)
{
// funkcje
}
}

Zauważyłem że recvfrom nie sprawdza czy w buforze są dane tylko bezpośrednio odczytuje.
No i jeśli program ma działać w tle to najlepiej żeby jak najmniej obciążał procesor a w tym wypadku cały czs wykonywana jest instrukcja if.
Jak zrobić żeby recvfrom sprawdzało czy w buforze są dane do odczytu?

0

recv powinieneś używać tylko gdy przyjdzie jakaś wiadomość do socketa...

Jeśli piszesz z użyciem WinAPI, możesz użyć WSAAsyncSelect(), funkcja powoduje, że do podanego okna zaczną napływać komunikaty, jeśli coś się dzieje z socketem, w przypadku przyjścia do socketa wiadomości dostajesz komunikat FD_READ i w nim możesz odczytać wiadomość przez recv

Jeżeli nie masz okien, istnieje funkcja select(), sprawdza ona właśnie czy do socketów nie nadeszły wiadomości, więcej na jej temat przeczytasz tu: http://paprykarz.org/dat/kursy/kursc/www.keeller.kompozytor.net/ws_udp_com.html

0

A jak wywołam WSAAsyncSelect i będę miał do odebrania jakiś plik to cały czas do okna będą wysyłane komunikaty co jest uciążliwe. Odbieranie plików może znajdować się w pętli komunikatów PeekMessage tylko co zrobić żeby już nie otrzymywać komunikatów do okna?

0
rafal44 napisał(a)

A jak wywołam WSAAsyncSelect i będę miał do odebrania jakiś plik to cały czas do okna będą wysyłane komunikaty co jest uciążliwe. Odbieranie plików może znajdować się w pętli komunikatów PeekMessage tylko co zrobić żeby już nie otrzymywać komunikatów do okna?

Szczerze mówiąc nigdy nie pobierałem większego pliku przez WinSock, ale skoro jest jak mówisz, proponuję zmienną globalną, która będzie mówiła czy odbywa się przesyłanie pliku, jeżeli tak, to ignoruj komunikaty...

0

jak korzystam z semi-blokujacych.
setsockopt z SO_RCVTIMEO, i jesli wyleci z 0 to client sie w jakis sposob rozlaczyl, a jak -1 to wylecial z sieci.
A jesli chodzi o recvfrom, to on blokuje az dostanie dane zaleznie od bind.

while((a = recvfrom) != -1){
WriteFile(a bajtow na stdout);
}

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