какая выгода от повторного использования сокетов в C # - PullRequest
2 голосов
/ 09 ноября 2010

Я занимаюсь разработкой библиотеки сокетов с открытым исходным кодом: https://sourceforge.net/projects/socketservers/

И я хотел бы добавить функцию повторного использования сокетов в эту библиотеку. Я реализовал черновик этой функции, но я не вижу никаких преимуществ в моих тестах. Клиент делает 32K подключения-разъединения на 8 элементов к серверу и измеряет время. Но нет никакой разницы между повторным использованием сокета и повторным использованием сокета - время, прошедшее для этого теста.

Что я делаю не так в тесте?

Какую выгоду должен получить сервер при повторном использовании сокетов и как измерить эту выгоду?

Ответы [ 3 ]

2 голосов
/ 09 ноября 2010

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

В неуправляемом коде вы будете использовать DisconnectEx() для повторного использованиясокет для последующего вызова AcceptEx() или ConnectEx(), скорее, первого.Таким образом, вы сначала создадите x сокетов и опубликуете свои асинхронные операции принятия с использованием AcceptEx().Когда клиенты подключаются к этим ожидающим соединениям, вы выполняете действия на сервере, а затем в конце звоните DisconnectEx() в сокет и отправляете новый AcceptEx(), используя этот сокет.Это избавляет от необходимости создавать новый сокет на этом этапе, и, следовательно, он более эффективен для сервера.Разница в производительности, вероятно, довольно небольшая, но ее стоит иметь на сильно загруженных серверах, которые принимают много недолговечных соединений.

Поэтому я предлагаю вам опубликовать некоторый код, показывающий, как вы повторно используете свой сокет после вызова Disconnect(true) вэто ...

0 голосов
/ 09 ноября 2010

Если вы имеете в виду что-то вроде SO_REUSEADDR или SO_REUSEPORT:

Повторное использование сокетов существенно важно, например, если ваш сервер дает сбой, но соединения по-прежнему сохраняются.

Если вы перезапустите свой сервер, вам, как правило, придется подождать, пока операционная система изящно не закроет эти соединения, прежде чем вы сможете повторно привязать сокет к этому порту.

Это может означать, что некоторые процессы, которые сильно зависят от вашего сервера, останавливаются до его перезапуска.

Благодаря функции повторного использования сокетов вы можете обойти эту проблему.

Возможно, для этого есть и другие применения, но сейчас я могу думать только об этом. Надеюсь, что это помогло.

0 голосов
/ 09 ноября 2010

Вопрос в том, не выполняет ли ОС или среда выполнения повторное использование автоматически при вызове нового сокета.
Документация по методу Socket.Disconnect указывает на это направление:

Закрывает сокетное соединение и позволяет повторно использовать сокет.
Так что это кажется чрезмерной оптимизацией.
...