Могут ли функции read () / recv () застрять, даже если я работаю с select ()? - PullRequest
0 голосов
/ 21 марта 2020

Я узнал о сокетах, я понял, что вы можете посещать клиентов с помощью потоков или с помощью функции select (), верно?

Согласно тому, что я понимаю, если вы звоните:

select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

Функция указывает, какой из указанных файловых дескрипторов готов к чтению, готов к записи или имеет ожидающее состояние ошибки, поэтому если я затем вызову:

read(int fildes, void *buf, size_t nbyte); или recv(int sockfd, void *buf, size_t len, int flags);

Функция будет зависать до тех пор, пока не найдет что-то для чтения или получения хотя бы в одном из указанных файловых дескрипторов или пока не поступит сигнал, который должен быть доставлен, и этот сигнал поступит в timeout , верно?

Ну, может ли функция read () / recv () зависнуть на неопределенное время, даже если я работаю с select () и указанным c таймаутом?

Потому что я пытаюсь для реализации клиента, способного отправлять и получать сообщения и изображения, он, очевидно, правильно отправляет файл, но после получения изображения программа продолжает ждать в read () навсегда.

Эта функция отвечает за получение изображения после вызова select () и было установлено, что изображение будет получено * 1022. *

void receive_image(int sock, FILE *fp_write){
    char buffer[256];
    char byte;

    fp_write = fopen("archivoRecibido.bmp","wb");
    enviarConfirmacion(sock);
    enviarMD5SUM(sock);

    while(read(sock, &byte, sizeof(byte)) > 0){
        fwrite(&byte,sizeof(byte),1,fp_write);
    }
    fclose(fp_write);
    puts("***PERFECT***");
}

Вопрос, в отношении которого у меня есть сомнения относительно моих знаний, заключается в том, что в теории файл не должен закрываться и не должен получать изображение, но это не тот случай, изображение получено правильно, что происходит так, что Я не могу вернуться в основной цикл, чтобы отправить еще одно сообщение, потому что думаю, что оно застряло в чтении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...