Реально ли такое сделать по одному TCP соединению?

Тема в разделе "WASM.NETWORKS", создана пользователем _DEN_, 22 мар 2009.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Клиент и сервет, keep-alive TCP соединение.

    Формат общения:

    1. Запрос-ответ (запрос клиентом по его же инициативе)
    2. Подписка клиентом (тем же запрос-ответ) на событие на сервере. Нотификацию по событию отправляет сервер клиенту, отправляет по собственной инициативе.

    Вопрос: реально ли это сделать на одном соединении? Я никак не могу придумать как это все засинхронизировать...
     
  2. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    Не только реально, но и достаточно стандартно. Пишешь заголовок для сообщений:
    byte type
    uint16 length
    ...

    и усё.
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    s0larian

    Не понял, при чем тут заголовки? Вопрос в том, что если в любой момент времени любая сторона по своей инициативе может решить что-то отправить, то как сделать так чтобы не произошло рассинхронизации?

    Например - клиент шлет запрос на сервер. Сервер в этот момент шлет нотификационное сообщение. Клиент читает нотификационное сообщение, думая что это ответ на только что отправленный запрос.
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Ааа... byte type - это тип пакета? То есть нотификация или ответ на запрос... Да, похоже на правду... Курю...
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Ну и я так понимаю, придется работать с неблокирующими сокетами в одном потоке?
     
  6. perez

    perez Member

    Публикаций:
    0
    Регистрация:
    25 апр 2005
    Сообщения:
    502
    Адрес:
    Moscow city
    Если ждать асинхронных сообщений, разумеется.
     
  7. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    ну как вариант - делать идентификатор. К примеру, отправляется команда х, где первые 4 байта - это ID команды/сессии. Когда приходит ответ y, он тоже содержит этот же ID. А вообще, команды разные - как можно спутать ответ сервера с запросом??? Ведь формат общения один. А если при принятии пакета ты понятия не имеешь, какая у него структура, то это конечно жесть
     
  8. Span

    Span New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2006
    Сообщения:
    134
    Можно глянуть в сторону ISO 8583.
    Там как раз
    - идентификаторы, связывающие запрос-ответ
    - типы сообщений
    - длины сообщений в заголовке.
    Еще интересная идея - битовая маска (удобно при переменном кол-ве полей)

    По этому протоколу в рамках одного ТСР соединения даже у некоторых банков в РФ проходит до нескольких сотен сообщений в минуту. Между запросом и ответом до десятков секунд (т.к. гонятся по всему миру, обрабатываются на весьма специфичном оборудовании/софте). Это я к вопросу синхронизации.

    Есть сессии типа запрос-ответ. Просто "нотификации". Эхо-тесты итд.

    На клиенте и сервере, как правило, очереди используются. Причем выбираются сообщения с учетом приоритета.
     
  9. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    s0larian, perez, MSoft, Span

    Спасибо, друзья, кажется я все понял :)