<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: Сокеты и сбои. Кто неправ?</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/8359.html</link>
    <description>Здравствуйте.&lt;br&gt;Я понимаю что вопрос будет звучать глупо, но все-же...&lt;br&gt;Пишется многопоточное приложение. Потоки ходят по серверам и проверяют их работоспособность. Все работает замечательно до...&lt;br&gt;Подсовываем одному из потоков невалидное имя. gethostbyname() возвращает NULL и дальше... остальные соединения начинают работать вразлад - когда коннектятся, когда нет... Причем имена разрезолвливаются, отказы идут на вызове connect().&lt;br&gt;Все вызовы стандартные блокирующие, вроде почти академическая задача... Почему возникают такие проблемы непонятно.&lt;br&gt;Не нужно ли как-то дполнительно сбрасывать/переинициаизировать ядро после неудачного резолва имени?&lt;br&gt;&lt;br&gt;С уважением,&lt;br&gt;Сергей&lt;br&gt;</description>

<item>
    <title>Сокеты и сбои. Кто неправ? (Kindzadza)</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/8359.html#16</link>
    <pubDate>Thu, 06 Aug 2009 15:24:36 GMT</pubDate>
    <description>&amp;gt;&lt;br&gt;&amp;gt;Заказчик хочет так. Кстати я не знаю что лучше для многих (неск. &lt;br&gt;&amp;gt;тысяч) запросов по разным адресам - много тредов или большие списки &lt;br&gt;&amp;gt;в select? &lt;br&gt;&lt;br&gt;Несколько threads и select. Создавать пару тысячь тредов - идиотизм.&lt;br&gt;</description>
</item>

<item>
    <title>Сокеты и сбои. Кто неправ? (blackswan)</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/8359.html#15</link>
    <pubDate>Thu, 06 Aug 2009 07:05:39 GMT</pubDate>
    <description>&amp;gt;&lt;br&gt;&amp;gt;У меня проблема решилась использованием gethostbyname_r() т.к. gethostbyname() работает со статическим внутренним &lt;br&gt;&amp;gt;буфером и требы могут портить его друг у друга. &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;А вообще не вредно посмотреть промежуточно что и как отдается как адрес &lt;br&gt;&amp;gt;для соединения. &lt;br&gt;&lt;br&gt;Если я испльзую не имя, а адрес и тогда gethostbyname не срабатывает, то та же ошибка с connect, адрес у меня &quot;127.0.0.1&quot;, превращается в значение 16777343 для service.sin_addr.s_addr. &lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Сокеты и сбои. Кто неправ? (crazy_blu)</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/8359.html#14</link>
    <pubDate>Thu, 06 Aug 2009 06:45:49 GMT</pubDate>
    <description>&amp;gt;А у меня другая проблема. Использую чужой код, который по идее должен &lt;br&gt;&amp;gt;работать как сокет-сервер. В hostname - char имя хоста или IP, &lt;br&gt;&amp;gt;в port - номер порта. &lt;br&gt;&amp;gt;    struct hostent *host = gethostbyname(hostname); &lt;br&gt;&lt;br&gt;&#091;skip&#093;&lt;br&gt;&lt;br&gt;&amp;gt;    if (connect(m_socket, (sockaddr*) &amp;service, sizeof(struct sockaddr)) &amp;lt; 0) &lt;br&gt;&lt;br&gt;&#091;skip&#093;&lt;br&gt;&lt;br&gt;&amp;gt;m_socket получает значение, однако при вызове connect получаю сообщение 61 Connection refused. &lt;br&gt;&amp;gt;&lt;br&gt;&lt;br&gt;У меня проблема решилась использованием gethostbyname_r() т.к. gethostbyname() работает со статическим внутренним буфером и требы могут портить его друг у друга.&lt;br&gt;&lt;br&gt;А вообще не вредно посмотреть промежуточно что и как отдается как адрес для соединения.&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Сокеты и сбои. Кто неправ? (blackswan)</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/8359.html#13</link>
    <pubDate>Thu, 06 Aug 2009 06:18:21 GMT</pubDate>
    <description>А у меня другая проблема. Использую чужой код, который по идее должен работать как сокет-сервер. В hostname - char имя хоста или IP, в port - номер порта. &lt;br&gt;  sockaddr_in service;&lt;br&gt;  memset(&amp;service, 0, sizeof(sockaddr_in));&lt;br&gt;  service.sin_family = AF_INET;&lt;br&gt;  service.sin_addr.s_addr = inet_addr(hostname);&lt;br&gt;&lt;br&gt;  if (service.sin_addr.s_addr == INADDR_NONE)&lt;br&gt;  &#123;&lt;br&gt;    struct hostent *host = gethostbyname(hostname);&lt;br&gt;    if (host == NULL &amp;#124;&amp;#124; host-&amp;gt;h_addr == NULL)&lt;br&gt;    &#123;&lt;br&gt;      printf( &quot;Problem accessing the DNS. (addr: &#037;s)&quot;, hostname);&lt;br&gt;      return false;&lt;br&gt;    &#125;&lt;br&gt;    service.sin_addr = *(struct in_addr*)host-&amp;gt;h_addr;&lt;br&gt;  &#125;&lt;br&gt;  service.sin_port = htons(port);&lt;br&gt;  m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);&lt;br&gt;  if (m_socket != -1)&lt;br&gt;  &#123;&lt;br&gt;    if (connect(m_socket, (sockaddr*) &amp;service, sizeof(struct sockaddr)) &amp;lt; 0)&lt;br&gt;    &#123;&lt;br&gt;      printf( &quot;&#037;s, failed to connect socket. Error: &#037;d&#092;n&quot;, &quot; &quot;, GetSockError());&lt;br&gt;      perror(&quot;connect&quot;);&lt;br&gt;    &#125;&lt;br&gt;  &#125;&lt;br&gt;m_socket получает значение, однако при вызове connect получаю </description>
</item>

<item>
    <title>Сокеты и сбои. Кто неправ? (crazy_blu)</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/8359.html#12</link>
    <pubDate>Sun, 19 Jul 2009 17:56:35 GMT</pubDate>
    <description>&amp;gt;Не надо пользоваться gethostbyname в многопоточной программе. Она использует статический буфер для &lt;br&gt;&amp;gt;результата.  И если её вызвать из двух потоков одновременно данные &lt;br&gt;&amp;gt;будут испорчены. Ты соединялся не с теми. но пока резолвилось нормально &lt;br&gt;&amp;gt;ты не замечал ошибку и не знал об этом )) &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Используй gethostbyname_r, а лучше getaddrinfo. В однопоточной программе тоже. &lt;br&gt;&lt;br&gt;Спасибо, ошибку понял!&lt;br&gt;&lt;br&gt;&amp;gt;&amp;gt;Вот пример. Процесс обработки довольно длительный и состоит из нескольких этапов.&lt;br&gt;&amp;gt;&amp;gt;Хочется &amp;gt;его прервать (прекратить) в любой момент.&lt;br&gt;&amp;gt;А как будешь освобождать ресурсы? А сохранять промежуточные результаты? А возвращать в &lt;br&gt;&amp;gt;корректное состояние? &lt;br&gt;&amp;gt;Прервал - и всё чудом вернулось как и было, или даже нет, &lt;br&gt;&amp;gt;все правильные изменения остались, а всё недоделанное откатилось )) Это чудо &lt;br&gt;&amp;gt;похлеще деда мороза. &lt;br&gt;&lt;br&gt;В SQL-серверах это называется транзакции. Они или комитятся или rollback :) Хочется аналогичное и по тредам :)&lt;br&gt;&lt;br&gt;&amp;gt;Хочется - это не аргумент. &lt;br&gt;&lt;br&gt;Ну согласен, но с другой строны, если бы не было желани</description>
</item>

<item>
    <title>Сокеты и сбои. Кто неправ? (svn)</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/8359.html#11</link>
    <pubDate>Sat, 18 Jul 2009 20:22:42 GMT</pubDate>
    <description>&amp;gt;  if( NULL == (hp = gethostbyname( strBuff )) ) &lt;br&gt;&lt;br&gt;Не надо пользоваться gethostbyname в многопоточной программе. Она использует статический буфер для результата.  И если её вызвать из двух потоков одновременно данные будут испорчены. Ты соединялся не с теми. но пока резолвилось нормально ты не замечал ошибку и не знал об этом ))&lt;br&gt;&lt;br&gt;Используй gethostbyname_r, а лучше getaddrinfo. В однопоточной программе тоже.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;gt;Вот пример. Процесс обработки довольно длительный и состоит из нескольких этапов.&lt;br&gt;&amp;gt;Хочется &amp;gt;его прервать (прекратить) в любой момент.&lt;br&gt;&lt;br&gt;А как будешь освобождать ресурсы? А сохранять промежуточные результаты? А возвращать в корректное состояние?&lt;br&gt;Прервал - и всё чудом вернулось как и было, или даже нет, все правильные изменения остались, а всё недоделанное откатилось )) Это чудо похлеще деда мороза.&lt;br&gt;&lt;br&gt;Хочется - это не аргумент.&lt;br&gt;Альтернатива потоку проверять не пора ли освободить ресурсы и завершать работу - это писать в некий журнал все ресурсы, и потом тот кто завершает работу потока их освоб</description>
</item>

<item>
    <title>Сокеты и сбои. Кто неправ? (crazy_blu)</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/8359.html#10</link>
    <pubDate>Sat, 18 Jul 2009 18:17:23 GMT</pubDate>
    <description>&amp;gt;&amp;gt;Ну хорошо - код ошибки как правило CONNECTION REFUSED &lt;br&gt;&amp;gt;&amp;gt;Почему? Кто? За что? &lt;br&gt;&amp;gt;На другом конце тебя не ждут. Наверно адрес не правильный )) Наверно &lt;br&gt;&amp;gt;ты адрес из имени не правильно получаешь. Как ты это делаешь? &lt;br&gt;&lt;br&gt;  struct hostent    * hp;&lt;br&gt;  struct sockaddr_in  sAddr;&lt;br&gt;  ...&lt;br&gt;  if( NULL == (hp = gethostbyname( strBuff )) )&lt;br&gt;  &#123;&lt;br&gt;    error( ... );&lt;br&gt;    goto finish;&lt;br&gt;  &#125;&lt;br&gt;  memset( &amp;sAddr, 0, sizeof( sAddr ) );&lt;br&gt;  memcpy( &amp;sAddr.sin_addr, hp-&amp;gt;h_addr, hp-&amp;gt;h_length );&lt;br&gt;  sAddr.sin_family = hp-&amp;gt;h_addrtype;&lt;br&gt;  sAddr.sin_port   = htons(req-&amp;gt;n_PortNumber);&lt;br&gt;  if( 0 &amp;gt; connect( req-&amp;gt;socket, (struct sockaddr*) &amp;sAddr, sizeof(sAddr) ) )&lt;br&gt;  &#123;&lt;br&gt;    error( ... );&lt;br&gt;    goto finish;&lt;br&gt;  &#125;&lt;br&gt;  ...&lt;br&gt;&lt;br&gt;&amp;gt;&amp;gt;А как их корректно завершать?&lt;br&gt;&amp;gt;Правильно вообще не завершать. Поток отработал и завершился сам, или встал в &lt;br&gt;&amp;gt;очередь за новым заданием. Разумеется не должен зависать )) &lt;br&gt;&amp;gt;&amp;gt;Проверять постоянно какой-то флаг? Но это неправильно. &lt;br&gt;&amp;gt;Это правильнее чем внешнее прерывание потока, которое потенциальная утечка ресурсов и не </description>
</item>

<item>
    <title>Сокеты и сбои. Кто неправ? (Аноним)</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/8359.html#9</link>
    <pubDate>Sat, 18 Jul 2009 16:52:41 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;работает замечательно до... &lt;br&gt;&amp;gt;Подсовываем одному из потоков невалидное имя. gethostbyname() возвращает NULL и дальше... остальные &lt;br&gt;&amp;gt;соединения начинают работать вразлад - когда коннектятся, когда нет... Причем имена &lt;br&gt;&amp;gt;разрезолвливаются, отказы идут на вызове connect(). &lt;br&gt;&amp;gt;Все вызовы стандартные блокирующие, вроде почти академическая задача... Почему возникают такие проблемы &lt;br&gt;&amp;gt;непонятно. &lt;br&gt;&amp;gt;Не нужно ли как-то дполнительно сбрасывать/переинициаизировать ядро после неудачного резолва имени? &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;С уважением, &lt;br&gt;&amp;gt;Сергей &lt;br&gt;&lt;br&gt;Может Вам стоит попробовать вместо gethostbyname() использовать gethostbyname_r().&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Сокеты и сбои. Кто неправ? (svn)</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/8359.html#8</link>
    <pubDate>Sat, 18 Jul 2009 12:53:09 GMT</pubDate>
    <description>&amp;gt;Ну хорошо - код ошибки как правило CONNECTION REFUSED &lt;br&gt;&amp;gt;Почему? Кто? За что? &lt;br&gt;&lt;br&gt;На другом конце тебя не ждут. Наверно адрес не правильный )) Наверно ты адрес из имени не правильно получаешь. Как ты это делаешь?&lt;br&gt;&lt;br&gt;&amp;gt;А как их корректно завершать?&lt;br&gt;&lt;br&gt;Правильно вообще не завершать. Поток отработал и завершился сам, или встал в очередь за новым заданием. Разумеется не должен зависать ))&lt;br&gt;&lt;br&gt;&amp;gt;Проверять постоянно какой-то флаг? Но это неправильно. &lt;br&gt;&lt;br&gt;Это правильнее чем внешнее прерывание потока, которое потенциальная утечка ресурсов и не  может использоваться для управления работой, максимум обработка ошибок.&lt;br&gt;&lt;br&gt;&amp;gt;Обрабатывать сигналы?&lt;br&gt;&lt;br&gt;Сигналы как и сокеты - принадлежат процессу. Посылать сигналы потокам было возможно используя недокументированные возможности некоторых реализаций. Надеятся на такую возможность глупо.&lt;br&gt;</description>
</item>

</channel>
</rss>
