SO_RCVTIMEO просто не создает условие тайм-аута в моих функциях вывода. Я разрабатываю службу передачи файлов с использованием протокола скользящего окна ARQ. Чтобы все было в порядке, я начинаю с базовой стратегии «Остановись и подожди».
Это моя инициализация timeval
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 100000;
Это мое использование этой структуры и сокета при подготовке тайм-аута recvfrom
if(setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv))<0)
{
fprintf(stderr, "Error in socket option for Timeout mechanism: %s",strerror(errno));
close(sock);
exit(EXIT_FAILURE);
}
if (-1 == bind(sock,(struct sockaddr *)&sa, sizeof(sa)))
{
perror("error bind failed");
close(sock);
exit(EXIT_FAILURE);
}
Это тело кода, которое должно истечь по тайм-ауту:
for(;;)
{
...
while((read_bytes=fread((char*)&(packet.body),sizeof(char),CHUNKSIZE,out_file))
{
...
while(1)
{
bytes_sent = sendto(sock, (struct sanpacket*)&packet, sizeof(struct sanpacket), 0,(struct sockaddr*)&sa, sizeof sa);
if (bytes_sent < 0)
{
fprintf(stderr, "%s\n", strerror(errno));
exit(EXIT_FAILURE);
}
printf("Waiting for ACK packet\n");
recsize = recvfrom(sock, (struct sanpacket*)&packet, sizeof(struct sanpacket), 0, (struct sockaddr*)&sa, &fromlen);
if(errno == EAGAIN)
{
printf("Timed out; resending packet with sequence number %d", packet.sequence_num);
continue;
}
if (recsize < 0)
{
fprintf(stderr, "%s\n", strerror(errno));
exit(EXIT_FAILURE);
}
}
Проблема: тайм-аут не срабатывает, но setsockopt также не возвращает никаких ошибок. У меня нет возможности узнать, что я делаю неправильно.
Если есть что-то еще, что я могу сделать, чтобы прояснить мой вопрос или окружающую среду, пожалуйста, дайте мне знать. И я был бы признателен, если бы у вас были какие-либо предложения по отладке этого.
errno
должен находиться внутри блокаif (recsize < 0)
. 2б. Я не понимаю вопроса. - person user207421   schedule 26.08.2014