winsock select()

0

Na początek powiem że dopiero zacząłem zabawę z socketami i nie jestem za bardzo kumaty. Mam pytanie czy da się przy użyciu funkcji select() zrobić tak żeby funkcja accept() nie blokowała programu? Mam taką funkcję połacz () którą wywołuję jako pierwszą w pętli a potem wywołuję odbior() ale accept() blokuje mi program i funkcja odbior() wywołuje się dopiero po podłączeniu wszystkich klientów? Jak zmienić tą funkcję select() żeby accept() nie blokował programu?

SOCKET serverSock;
struct klient {
    SOCKET sock;
    SOCKADDR_IN addr;
};
struct klient klieci[4];
SOCKADDR_IN serverAddr;
fd_set gniazda;
int sizeAddr;
int serverSizeAddr;
int ileKlietow= 0;
int i = 0;

void polacz()
{
            FD_ZERO(&gniazda);
            FD_SET(klieci[ileKlietow].sock, &gniazda);
            select(0, &gniazda, NULL, NULL, (struct timeval *) 0);
            if (FD_ISSET(klieci[ileKlietow].sock, &gniazda)) {
                sizeAddr = sizeof(klieci[ileKlietow].addr);
                klieci[ileKlietow].sock = accept(sSock, (struct sockaddr *) &klieci[ileKlietow].addr, &sizeAddr);
                if (klieci[ileKlietow].sock == INVALID_SOCKET) {
                    return 1;
                } else {
                    printf("Polonczono z klientem %d (%s).\n", ileKlietow, inet_ntoa(klieci[ileKlietow].addr.sin_addr));
                    FD_SET(klieci[ileKlietow].sock, &gniazda);
                    ileKlietow++;
                }
            }
}
0

Jak zmienić tą funkcję select() żeby accept() nie blokował programu?

select powinien mieć timeout ustawiony na zero (chodzi o pola struktury timeval, a nie wskaźnik). W twoim kodzie funkcja nie ma ustawionego timeout'u, blokuje do czasu nadejścia nowego połączenia, czyli zachowuje się dokładnie tak, jak blokujący accept.

0

nie uzywaj select, funkcja ma wiele bledow i trzeba sie niezle nameczyc by uzyskac to co blokujacym recv/send/accept.
dla mnie jedyne rozwiazanie to watki.

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