Максимальное количество подключений TCP к машине

Я создаю службу Windows в .NET, к которой может подключиться N клиентов. Служба запускает прослушиватель TCP и принимает клиентские подключения. Проблема, с которой я столкнулся, заключается в том, что я могу открыть только 10 подключений к этой службе. Метод listener::AcceptTcpClient() принимает только 10 соединений и выдает исключение для 11-го. Клиентское приложение использует класс System.Net.Sockets.TcpClient, а служба использует класс System.Net.Sockets.TcpListener.

Это исключение, которое я получаю, когда пытаюсь установить несколько подключений в цикле for к этой службе (после того, как установлено 10-е подключение):

«Невозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленным хостом»


person A9S6    schedule 18.03.2009    source источник


Ответы (2)


Похоже, вы столкнулись с известным ограничением в 10 подключений для полуоткрытого TCP. подключения в Windows XP. Это ограничение жестко запрограммировано в XP SP 2, и его невозможно обойти, кроме исправления вашей системы, что может технически нарушить ваше лицензионное соглашение с конечным пользователем (IANAL). XP, увы, не предназначена для серверной системы.

Для Windows XP Professional максимальное количество других компьютеров, которым разрешено одновременно подключаться к сети, равно десяти. Это ограничение включает все транспорты и протоколы совместного использования ресурсов вместе взятые. Для Windows XP Home Edition максимальное количество других компьютеров, которым разрешено одновременно подключаться к сети, равно пяти. Это ограничение представляет собой количество одновременных сеансов с других компьютеров, которые разрешено размещать в системе. Это ограничение не распространяется на использование инструментов администрирования, подключаемых с удаленного компьютера.

person John Feminella    schedule 18.03.2009
comment
Что, если я использую серверную операционную систему, такую ​​как Windows Server 2003? - person A9S6; 18.03.2009
comment
Ограничение не должно присутствовать в серверной операционной системе. Серверные операционные системы предназначены (и должны) принимать множество подключений. - person John Feminella; 18.03.2009
comment
Но я получаю ту же ошибку, когда запускаю свою службу на Windows Server 2003 и пытаюсь подключиться к ней. - person A9S6; 18.03.2009
comment
@Abhimanyu: если клиент работает на XP, к нему будет применяться ограничение исходящего трафика, даже если сервер может принимать больше подключений. - person Richard; 18.03.2009
comment
Это ограничение применяется только к определенным протоколам приложений MS, которые используют TCP (почта, общие ресурсы и т. д.). Это не общее ограничение для TCP-соединений на уровне сокетов. Возможно, класс .NET TcpClient также применяет это ограничение... причина использовать другой набор библиотек? Я знаю, что это не так, поскольку я часто тестирую программы, отличные от .NET, под XP, а теперь и с Windows 7 Home/Ultimate, где ограничение равно 20, но мои серверные и клиентские приложения смогли установить сотни подключений к одному и тому же хозяин. - person Kevin Brock; 08.04.2010
comment
@Richard: почему должно быть ограничение на исходящие соединения? XP является клиентской ОС, поэтому ей должно быть разрешено устанавливать столько сокетов к серверу, сколько необходимо. Теперь MS установила ограничение на полуоткрытые TCP-соединения, которое также ограничено до 10 (по-видимому, они остановили эту политику в Vista SP2 и более поздних версиях windowsbbs.com/general-discussions/), но это другое чем ограничение установленных соединений. Возможно, тогда сервер в ОП недостаточно быстро завершал прием соединений. - person Kevin Brock; 08.04.2010
comment
@Kevin: В вопросе нет ничего, что указывало бы на то, что сервер не на XP (или другом клиенте). Но, похоже, я исказил свой комментарий (должен был сказать, является ли сервер...). - person Richard; 08.04.2010

Я не думаю, что ответ, который был дан ранее, действителен. Я провел некоторое исследование, и, похоже, нет причин, по которым TcpClient имеет какие-либо строгие ограничения. В другом ответе предлагалось ограничение в 10 активных TCP-соединений в Windows XP для серверной службы, но это верно только для определенных протоколов приложений (таких как совместное использование, почта), предоставляемых Microsoft.

Однако я обнаружил, что Microsoft добавила некоторые ограничения в XP SP2 и продолжила в Vista SP1 ограничивать полуоткрытые TCP-соединения до 10. Они также ограничили количество новых подключений до 10 в течение одной секунды. Обе эти попытки были попытками уменьшить воздействие вирусного программного обеспечения. Очевидно, они не были очень успешными, поэтому Microsoft, наконец, решила удалить их в Vista SP2 и более поздних версиях.

Возможно, это была реальная проблема ОП - возможно, вы слишком быстро пытаетесь создать эти соединения в клиенте?

Как я упоминал в своих комментариях к ранее принятому ответу, я лично пишу программное обеспечение клиент / сервер, и у меня не было проблем с ограничением 10. Когда я выполняю тесты, используя Windows XP в прошлом и теперь с Windows 7 (ограничение приложений сейчас 20 подключений), я могу легко превысить этот лимит. Я только что провел повторное тестирование и смог создать > 140 активных/установленных соединений между одним хостом (Windows 7 Home Premium) и другим хостом (Windows 7 Enterprise); обе клиентские операционные системы. Это использует Java, но на самом деле не должно быть никакой разницы с .NET (который я также тестировал в прошлом).

person Kevin Brock    schedule 08.04.2010