TCP Отправляет, не возвращает процесс катастрофического отказа причины

There’s хороший подход к этой проблеме, которая использует векторные векторные произведения. Определите 2-мерное векторное векторное произведение В Г v — В w, чтобы быть vxВ w yВ в€ ’В v yВ wx.

предположим эти два линейных сегмента, выполненные от [1 183] p к [1 184] pВ +В r и от [1 186] q к [1 187] qВ +В s. Затем любая точка на первой строке является представимой как [1 189] pВ +В tВ r (для скаляра parameterВ t) и любая точка на второй строке как [1 191] qВ +В uВ s (для скалярного parameterВ u).

Two line segments intersecting

Эти две строки пересекаются, если мы можем найти t и u таким образом что:

p + tВ r = q + uВ Крест s

Formulae for the point of intersection

обе стороны с [1 197] s, добираясь

( p + tВ r) Г — s = ( q + uВ s) Г — s

И с тех пор В Г s — В s = 0, это означает

tВ ( r Г — s) = ( q в€’ p) Г — s

И поэтому, решая для [1 118] t:

t = ( q в€’ p) Г — s / ( r Г — s)

Таким же образом, мы можем решить для [1 120] u:

( p + tВ r) Г — r = ( q + uВ s) Г — r

uВ ( s Г — r) = ( p в€’ q) Г — r

u = ( p в€’ q) Г — r / ( s Г — r)

Для сокращения количества шагов вычисления удобно переписать это следующим образом (помнящий что В Г s — В r = в€ ’В В Г r — В s):

u = ( q в€’ p) Г — r / ( r Г — s)

Теперь существует четыре случая:

  1. , Если В Г r — В sВ =В 0 и ( qВ в€ ’В p) В Г — В rВ =В 0, то эти две строки коллинеарны.

    В этом случае, выразите конечные точки второго сегмента ( q и qВ +В s) с точки зрения уравнения первого линейного сегмента ( p + t r):

    t0 = ( q в€’ p) В В · В r / ( В В r · В r)

    t1 = ( q + s в€’ p) В В · В r / ( В В r · В r) = t0 + В В s · В r / ( В В r · В r)

    , Если интервал между [1 130] t0 и t1 пересекает интервал [0, 1] затем линейные сегменты, являются коллинеарными и перекрывающимися; иначе они являются коллинеарными и непересекающимися.

    Примечание, что, если s и точка r в противоположных направлениях, то В В s · В r < 0 и таким образом, интервал, который будет проверен, является [ t1, t0], а не [ t0, t1].

  2. , Если В Г r — В sВ =В 0 и ( qВ в€ ’В p) В Г — В % r В в В 0, то эти две строки параллельны и не пересекаются.

  3. , Если В Г r — В % s В в В 0 и 0В в‰ ¤В В в‰ t 1¤В и 0В в‰ ¤В В в‰ u 1¤В, эти два линейных сегмента встречаются в точке p + tВ r = q + uВ s.

  4. Иначе, эти два линейных сегмента не параллельны, но не пересекаются.

Кредит: этот метод является 2-мерной специализацией 3D перекрестного алгоритма строки из статьи "Intersection of two lines in three-space" Ronald Goldman, опубликованного в [1 140] Графические Драгоценные камни , страница 304. В трех измерениях обычный случай - то, что строки являются скосом (ни параллель, ни пересекающийся), в этом случае, метод дает точки самого близкого подхода этих двух строк.

8
задан Danny 25 August 2009 в 19:22
поделиться

2 ответа

Это вызвано сигналом SIGPIPE. См. send (2) :

Функция send () завершится ошибкой, если:
[EPIPE] Сокет отключен для записи, или сокет находится в режиме подключения и больше не подключен. В последнем случае, если сокет имеет тип SOCK_STREAM или SOCK_SEQPACKET и флаг MSG_NOSIGNAL не установлен, для вызывающего потока генерируется сигнал SIGPIPE.

Вы можете избежать этого, используя MSG_NOSIGNAL при вызове send () или игнорированием сигнала SIGPIPE с сигналом (SIGPIPE, SIG_IGN) в начале вашей программы. Затем функция send () вернет -1 и установит errno в EPIPE в этой ситуации.

15
ответ дан 5 December 2019 в 10:04
поделиться

Вам нужно игнорировать сигнал SIGPIPE. Если в сокете происходит ошибка записи, ваш процесс получает SIGPIPE, и поведение этого сигнала по умолчанию - убить ваш процесс. Написание сетевого кода на * nix обычно требуется:

signal(SIGPIPE,SIG_IGN);
2
ответ дан 5 December 2019 в 10:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: