WCF: Система. Сеть. SocketException - Только одно использование каждого адреса сокета (адрес/порт протокола/сети) обычно разрешается

Можно передать regex в оператор разделения JavaScript. Например:

"1,2 3".split(/,| /) 
["1", "2", "3"]

Или, если Вы хотите позволить нескольким разделителям вместе действовать как одно единственное:

"1, 2, , 3".split(/(?:,| )+/) 
["1", "2", "3"]

(Необходимо использовать неполучение (?:) parens, потому что иначе это становится соединенным назад в результат. Или можно быть умными как Aaron и использовать класс символов.)

(Примеры, протестированные в Safari + FF)

46
задан Community 23 May 2017 в 12:09
поделиться

1 ответ

Вы перегружаете стек TCP / IP. Windows (и я думаю, что на самом деле все стеки сокетов) имеют ограничение на количество сокетов, которые могут быть открыты в быстрой последовательности из-за того, как сокеты закрываются при нормальной работе. Всякий раз, когда сокет закрыт, он переходит в состояние TIME_WAIT на определенное время (240 секунд IIRC). Каждый раз, когда вы опрашиваете, сокет расходуется за пределы динамического диапазона по умолчанию (я думаю, что это около 5000 динамических портов чуть выше 1024), и каждый раз, когда этот опрос заканчивается, этот конкретный сокет переходит в TIME_WAIT. Если вы опрашиваете достаточно часто, вы в конечном итоге израсходуете все доступные порты, что приведет к ошибке TCP 10048.

Обычно WCF пытается избежать этой проблемы, объединяя соединения и тому подобное. Обычно это происходит с внутренними службами, которые не работают через Интернет. Я не уверен, поддерживает ли какая-либо из привязок wsHttp пул соединений, но привязка netTcp должна. Я бы предположил, что именованные каналы не сталкиваются с этой проблемой. Я не могу сказать о привязке MSMQ.

Есть два решения, которые вы можете использовать, чтобы обойти эту проблему. Вы можете увеличить динамический диапазон портов или уменьшить период TIME_WAIT. Первый вариант, вероятно, более безопасен, но если вы используете слишком большой объем сокетов (что не похоже на ваш сценарий), уменьшение TIME_WAIT - лучший вариант (или оба вместе).

Динамический диапазон портов

  1. Откройте regedit.
  2. Откройте ключ HKLM \ System \ CurrentControlSet \ Services \ Tcpip \ Parameters
  3. Измените (или создайте как DWORD) значение MaxUserPort.
  4. Установите более высокое значение. (т.е. 65534)

Изменение задержки TIME_WAIT

  1. Откройте regedit.
  2. Откройте ключ HKLM \ System \ CurrentControlSet \ Services \ Tcpip \ Parameters
  3. Отредактируйте (или создайте как DWORD) TcpTimedWaitDelay.
  4. Установите меньшее число. Значение в секундах. (т.е. 60 для задержки в 1 минуту)

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

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

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

73
ответ дан 26 November 2019 в 20:28
поделиться
Другие вопросы по тегам:

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