LANG: C/ENV: LinuxStreaming двигатели передового опыта в C
Я разрабатываю потоковый двигатель, потому что теперь я могу запускать, останавливать и приостанавливать поток, но ищет является операция, которая дает у меня много головной боли, я уже задал вопрос здесь раньше и исправил некоторые вопросы внутри кода из ответов.
Использование lseek() функция, Я передаю дескриптор открытого потокового файла в качестве первого аргумента, плюс я использую UDP для передачи, что-то вроде следующего кода:
transport_fd = open(tsfile, O_RDONLY);
int offset = 1024;
off_t offsetIndicator;
if ((offsetIndicator=lseek(transport_fd, offset, SEEK_CUR))<0) printf("Error seeking\n");
Всякий раз, когда я пытаюсь искать при потоковой передаче потоки останавливаются и изображения висят.
Что я должен обратить внимание на ?, то есть: как попытка сна() или nanosleep() после ищу в файл для того, чтобы изменения вступили в силу.
Я не мог найти примеры, документы или реальные статьи для лучших практик в таких двигателях.
EDIT:
После тестирования, похоже, файл продолжает течь, но приемные устройства в сети не поймать связь потока больше, и расчет времени, которое потребовалось, чтобы закончить после того, как вычитать ищу раз, поток, похоже, завершен в обычном режиме.
КОД SNIPPET:
while (!completed)
{
while (/* Comparing conditions */ && !completed)
{
if (seekLck == 1) // seekLck is a semaphore to test seek signal from father process initiated by 0
{
int offset = 1024;
off_t offsetIndicator;
if ((offsetIndicator=lseek(transport_fd, offset, SEEK_CUR))<0)
printf("Error seeking\n");
nanosleep(&nano_sleep_packet, 0); //Try to sleep to see if it is still hanging, didn't work
seekLck = 0;
}
len = read(transport_fd, send_buf, packet_size);
if(len < 0) {
fprintf(stderr, "File read error \n");
completed = 1;
}
else if (len == 0)
{
fprintf(stderr, "Sent done\n");
completed = 1;
}
else
{
sent = sendto(sockfdstr, send_buf, len, 0, (struct sockaddr *)&addr, sizeof(struct sockaddr_in));
if(sent <= 0)
{
perror("send(): error ");
completed = 1;
}
}
}
nanosleep(&nano_sleep_packet, 0);
}
close(transport_fd);
close(sockfdstr);
free(send_buf);
printf("cleaning up\n");
return 0;
}
(Не эксперт, но ...) Чтение страницы man для lseek, при сбое, оно должно заполнять 'errno'. См. Страницу [lseek # errors man] (http://man7.org/linux/man-pages/man2/lseek.2.html#ERRORS) и [errno manpage] (http://man7.org/linux/man -pages/man3/errno.3.html). Это может привести к дополнительной информации. – wmorrison365
Нет ошибок при поиске, и из моего кода он должен печатать сообщение об ошибке, я проверил позицию указателя после поиска, и это было точно, но поток повесился, поэтому я ищу мнение о том, что может быть пошло не так в там! – Ash
Характер вашей проблемы определенно специфичен для вашей реализации сервера, а может быть, и для реализации вашего клиента. 'Lseek()' вряд ли сам по себе будет проблемой. Вы не дали нам ничего, с чем мы можем работать. –