The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"таймауты в сокетах"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"таймауты в сокетах"
Сообщение от vvk emailИскать по авторуВ закладки on 29-Мрт-03, 11:59  (MSK)
если я посылаю информацию через сокеты с помощью хелпера
int sock_write(int sockfd, const char *buf, int count)
{
  size_t bytes_sent = 0;
  int this_write;

  while (bytes_sent < count) {
    do
      this_write = write(sockfd, buf, count - bytes_sent);
    while ( (this_write < 0) && (errno == EINTR) );
    if (this_write <= 0)
      return this_write;
    bytes_sent += this_write;
    buf += this_write;
  }
  return count;
}

как разобраться с таймаутами. коннекта нет, но прога не ругается. а мне надо бы, чтобы она оперативно определила проблему и попыталась послать снова. а у меня она все висит и чего то ждет. наверное таймауты где то стоят неверные? или какой то сигнал обработать надо?

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "таймауты в сокетах"
Сообщение от Max Zinal emailИскать по авторуВ закладки on 29-Мрт-03, 20:36  (MSK)
Вообще можно попробовать сочетание poll() / select()
с последующим send()ом (а не write()ом).
poll() можно сделать на возможность отправки
данных и с таймаутом. Если poll() успешно
завершился, можно сделать send().

Вообще невредно проверить, в write() ли стоит прога,
или непрерывно вертится в цикле из-за ошибок передачи?

  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "таймауты в сокетах"
Сообщение от vvk emailИскать по авторуВ закладки on 30-Мрт-03, 12:00  (MSK)
ок, большое спасибо. попробую сначала проверить во write... это вроде проще

>Вообще можно попробовать сочетание poll() / select()
>с последующим send()ом (а не write()ом).
>poll() можно сделать на возможность отправки
>данных и с таймаутом. Если poll() успешно
>завершился, можно сделать send().
>
>Вообще невредно проверить, в write() ли стоит прога,
>или непрерывно вертится в цикле из-за ошибок передачи?


  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "таймауты в сокетах"
Сообщение от vvk emailИскать по авторуВ закладки on 01-Апр-03, 20:39  (MSK)
>Вообще невредно проверить, в write() ли стоит прога,
>или непрерывно вертится в цикле из-за ошибок передачи?

хмм... после вызова
this_write = write(sockfd, buf, count - bytes_sent);
выдергиваю кабель сетевой. ничего не происходит. я так рассчитывал, что после этого write должен завершиться, вернув 0 (не смог послать ничего) или -1 (ошибка). но нет, он там внутри себя похоже продолжает что то слать. при этом если подождав пару минут воткнуть кабель обратно, он как ни в чем ни бывало продолжает посылать, все отсылает... причем все пучком!

что же это за неубиваемый write!!! почему он не ругается, что послать не может! я то думал у меня в этом куске проблема, а проблема глубже. получается и весь этот код не нужен, раз уж write сам по себе прекрасно справляется со всякими невозможностями посылки данных.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "таймауты в сокетах"
Сообщение от vvk emailИскать по авторуВ закладки on 01-Апр-03, 22:13  (MSK)
вот блин. написал такой код:

fd_set active_fd_set;

FD_ZERO (&active_fd_set);
FD_SET (sock, &active_fd_set);

// send content
printf("sending client data\n");
CReqList *pt = m_pReqList;
do
{

  struct timeval tv;

  tv.tv_sec = 1;
  tv.tv_usec = 0;
  printf("select...");
  if (select (FD_SETSIZE, &active_fd_set, NULL, NULL, &tv) < 0)
  {
    printf("sending error (select)\n");
    return FALSE;
  }
  else
  {
    printf("send\n");
    int res = send(sock, pt->buf, pt->len, MSG_NOSIGNAL);
    if(res < 0)
    {
      printf("sending error (send)\n");
      return FALSE;
    }

  }
  pt = pt->next;
} while( pt );

запускаю глюкалу... начинает отсылать... ок, выдергиваю кабель из сетевухи... и просто офигеваю!  строчки "select...send" продолжает еще некоторое время появляться на экране! типа все отсылается!
потом замирает (замирает на send). а ведь я хотел, чтобы вернула фальш в случае ошибки, и ошибка ведь на лицо! кабель то выдернут! интнета нету!
через пару минут втыкаю обратно кабель - немного подождав продолжает отсылать. и опять все пучком!
ХОЧУ СООБЩЕНИЕ ОБ ОШИБКЕЕЕЕЕЕ!!! где оно?

  Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "таймауты в сокетах"
Сообщение от romanSA Искать по авторуВ закладки on 02-Апр-03, 11:27  (MSK)
Уважаемый vvk!

Я советую Вам почитать "Эффективное программирование TCP/IP" Снейдера (всего 123 руб.) или что-нибудь из Стивенса по сетевому программированию (UNIX Network Programming).
Там этот вопрос обсуждается и даются некоторые рецепты.

В кратце, внутренние таймауты в TCP/IP очень большие - порядка ДЕСЯТКОВ минут (впрочем это зависит от системы). И всё это время на уровне протокола TCP/IP будут предприниматься попытки отсылки данных, без возврата ошибки в вызывающую функцию.

Самый простой способ - устроить собственные таймауты. Например,  использовать сигналы (напр. alarm() ).


  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру