2012-01-12 2 views
0

Мое приложение написано на .net и работает через сервер Windows. Он подключается через TCP/IP с удаленным сервером и продолжает слушать. Он отправляет только одно сообщение в начале соединения, которое является регистрационным сообщением, и после этого оно никогда не отправляет какое-либо сообщение, а просто слушает с сервера. Его потоковый сокет и пакеты продолжают поступать довольно часто, наступает около 6000 пакетов размером от 60 до 200 байтов. До сих пор я использую класс socket и подключается к удаленному серверу. После отправки запроса на вход я начинаю получать поток на постоянной основе. Чтобы получить поток, я использую BeginReceive, socketflags none. И после каждого начинания он повторяет задачу. Есть ли другой способ получить поток быстрее. Мое приложение - в реальном времени и очень очень критично. Даже 1 микросекунда. Может кто-нибудь предложить.Является ли класс Tcpclient/Tcplistner более быстрым, чем класс сокетов

+0

Это поможет показать больше кода; как выглядит ваш приемный цикл? – bobbymcr

+1

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

ответ

2

TcpClient просто обертка на вершине в Socket и NetworkStream. Он не будет работать быстрее - это просто другой (более удобный) API. Кроме того, как отмечает Йоахим, это вряд ли станет настоящим узким местом.

Некоторые идеи, которые вы можете попробовать:

  • при использовании NetworkStream API, проверьте DataAvailable, что указывает на наличие в буфер данных; если есть, то попробуйте не обрабатывать синхронизации (через несколько Read) до DataAvailable ложно, в котором точке переключения на асинхронный * (BeginRead)
  • отдельных этапы буферизации сообщений против обработки сообщений - ваш компьютер, скорее всего, имеет более одного ядра, а отдельная очередь чтения/процесса-очереди может увеличить пропускную способность; Вы могли бы также рассмотреть вопрос о параллельных потоков обработки, но это более сложный

При работе с удаленным сервером, «Даже 1 микросекунды вопросы» просто неосуществимым. На этом уровне вы также хотели бы работать сумасшедшим по сбору мусора, возможно, глядя на использование struct (прохождение через ref), что очень сильно отличается от использования class и не может быть изменено путем замены. И пул объектов и т. Д. Очень сложно.

Смежные вопросы