Я узнал о сокетах, я понял, что вы можете посещать клиентов с помощью потоков или с помощью функции 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***");
}
Вопрос, в отношении которого у меня есть сомнения относительно моих знаний, заключается в том, что в теории файл не должен закрываться и не должен получать изображение, но это не тот случай, изображение получено правильно, что происходит так, что Я не могу вернуться в основной цикл, чтобы отправить еще одно сообщение, потому что думаю, что оно застряло в чтении.