Как написать tcp сервер ?

Discussion in 'Hardware and Software' started by Sashan, Mar 25, 2003.

  1. PressLuftHammer

    PressLuftHammer FH Beta Tester

    Joined:
    Mar 5, 2003
    Messages:
    15,084
    Location:
    Ekaterinburg (Russia)

    А зачем более интенсивный трафик то ? Ежли только там нужно пердавать большее количество данных.
    Да и Квака тоже пакеты в независимости от FPS шлет :)
    Думаю не больше 10 в секунду. Промежуточные координаты вычисляет на основе скорости и направления движения.

    Может кто скажет используются ли потоки в WB сервере или все делается в одном потоке ? Даже интересно стало :)
     
  2. Sashan

    Sashan Well-Known Member

    Joined:
    Dec 18, 2001
    Messages:
    279
    Location:
    Novosibirsk, Russia
    У меня был точно такой-же эффект и не раз, т.к. я модемщик.
    И это ничего не объясняет... Доподленно может быть известно только когда есть мониторинг пакетов.
     
    Last edited: Apr 10, 2003
  3. Sashan

    Sashan Well-Known Member

    Joined:
    Dec 18, 2001
    Messages:
    279
    Location:
    Novosibirsk, Russia
    Не зачем, а почему.... в кваке каждый чих идёт на сервер - будь-то движение, смена оружия, и стрельба. Там довольно навороченная система лаг-компенсации, и сервер корректирует положение игрока. Соответственно и трафик.

    А вообще я затевал этот топик, потомучто мне тоже интересно как WB сделан... но мне по большому счёту пофиг до транспорта и потоков... мне интересен "логический" протокол верхнего уровня - как организован обмен, кто его инициирует в зависимости от событий. Толи сервер безусловно шлёт пакеты, то ли это делается по инициативе клиента....
     
  4. PressLuftHammer

    PressLuftHammer FH Beta Tester

    Joined:
    Mar 5, 2003
    Messages:
    15,084
    Location:
    Ekaterinburg (Russia)
    На мой взгляд шлет запросы клиент а отвечет ему сервер.
    Клиент посылает данные об игроке сервер шлет данные обо всех участниках игры.
     
  5. Sashan

    Sashan Well-Known Member

    Joined:
    Dec 18, 2001
    Messages:
    279
    Location:
    Novosibirsk, Russia
    2 PressLuftHammer.
    И еще про threads. Убился, но нигде не смог найти упоминание о цифре 18.2 переключений / сек = MAX для винды.... Ты уверен, что так и есть ?
    Первый раз слышу...
     
  6. PressLuftHammer

    PressLuftHammer FH Beta Tester

    Joined:
    Mar 5, 2003
    Messages:
    15,084
    Location:
    Ekaterinburg (Russia)
    Именно с этой частотой работает виндовый таймер. Именно с такой периодичностью переключаются контексты. Можно конечно поглядеть поподробней вот только доберусь до книжек соответсвующих :)
     
  7. Sashan

    Sashan Well-Known Member

    Joined:
    Dec 18, 2001
    Messages:
    279
    Location:
    Novosibirsk, Russia
    Это стандартный таймер... есть мультимедиа таймеры - у них разрешение 1 мсек имхо.
     
  8. Sea

    Sea Well-Known Member

    Joined:
    Feb 9, 2001
    Messages:
    27,702
    Location:
    Ukraine, Kiev
    18.2 раза в сек таймер часиков тикают, которые время считают. А процессорный таймер что задачи делит тикает намного сложнее.
     
  9. --oleg

    --oleg Well-Known Member

    Joined:
    Dec 20, 2001
    Messages:
    4,414
    Location:
    Russia
    Неа. По большей части они оба просто шлют друг другу свою инфу без всяких запросов и подтверждений.
     
  10. PressLuftHammer

    PressLuftHammer FH Beta Tester

    Joined:
    Mar 5, 2003
    Messages:
    15,084
    Location:
    Ekaterinburg (Russia)
    Для случая с TCP в этом случае нужно тогда два порта.
    Для UDP сервер просто может непонять кому он должен и чего посылать. Насколько помню там адрес и порт отправителя узнается только при получении пакета функция recfrom.
    Хотя конечно можно извратится и запомнить адреса клиентов при подключении а далее просто рассылать по ним данные.
    Но при этом клиент должен все время ждать пакеты.

    И кстати я говорил вовсе не о подтверждениях.

    Например можно так
    1.Клиент шлет свои координаты серверу.
    2.Сервер получает координаты клиента изменяет их в своих данных и отсылает данные по всем участникам игры клиенту.

    Это возможно как по TCP так и по UDP только во встором случае без гарантии получения пакета.
     
  11. PressLuftHammer

    PressLuftHammer FH Beta Tester

    Joined:
    Mar 5, 2003
    Messages:
    15,084
    Location:
    Ekaterinburg (Russia)
    Кстати вот есче вспомнил можно в одном потоке обслуживать несколько сокетов используя функцию select.
     
  12. --oleg

    --oleg Well-Known Member

    Joined:
    Dec 20, 2001
    Messages:
    4,414
    Location:
    Russia
    С какого перепугу? БТВ, птички, вроде, одним обходятся.

    Мы же о птичках говорим? Там только TCP.

    Ты говорил о запросах и ответах ;)
    Так вот их и нет (в большинстве случаев, как минимум).

    А на деле так (афаик):
    Клиент шлет свои координаты на сервер, независимо от того, получает он что-то от сервера или нет.
    Сервер рассылает всем координаты остальных игроков (и пр. инфу), независимо от того, шлют ему что-то клиентские машины или нет.
     
  13. PressLuftHammer

    PressLuftHammer FH Beta Tester

    Joined:
    Mar 5, 2003
    Messages:
    15,084
    Location:
    Ekaterinburg (Russia)

    Для TCP это не приемлимо. Представь себе когда клиент послал свои данные send а сервер шлет ему навстречу.
    TCP протокол с гарантированой доставкой данных. Т.е пока пакет неотправлен а следовательно не принят другой стороной выполнение приостанавливается до подтверждения приема данных другой стороной или ошибки. Т.е посылая друг другу данные одновременно обе стороны будут ждать бесконечно подтверждения от друг друга или истечения таймаутов.
     
  14. Sea

    Sea Well-Known Member

    Joined:
    Feb 9, 2001
    Messages:
    27,702
    Location:
    Ukraine, Kiev
    Не выполнение приостанавливается, а передача. И то не всегда, после таймаута будут повторно послан пакет. И может быть послано сразу несколько пакетов без ожидания подтверждения.
     
  15. --oleg

    --oleg Well-Known Member

    Joined:
    Dec 20, 2001
    Messages:
    4,414
    Location:
    Russia
    Я не настолько хорошо разбираюсь в реализации TCP на нижнем уровне, чтобы уверенно говорить о том, что и как там происходит.
    Тем не менее:
    1) Одновременных событий не бывает.
    2) Если невозможно принимать и передавать в данные в одно и то же время, значит начало передачи с одной стороны блокирует передачу с другой. То, что во время передачи клиент сам не может ничего принимать, никому не мешает.
    3) Запросы и подтверждения есть, но на нижнем уровне реализации протокола.

    Если тебе интересно, как это все происходит "внизу" - поищи в интернете статью "Протокол TCP"
    Семенов Ю.А. (ГНЦ ИТЭФ), например. К сожалению, адрес сайта я посеял :(
     
  16. PressLuftHammer

    PressLuftHammer FH Beta Tester

    Joined:
    Mar 5, 2003
    Messages:
    15,084
    Location:
    Ekaterinburg (Russia)
    повторы и посылка без подтверждения это все на нижнем уровне. Обычно же в играх алгоритм передачи nagle отключается опцией NO_DELAY чтобы пакет отправлялся немедленно а не ждал заполнения буфера. Приостановка же идет именно в программе.
     
  17. PressLuftHammer

    PressLuftHammer FH Beta Tester

    Joined:
    Mar 5, 2003
    Messages:
    15,084
    Location:
    Ekaterinburg (Russia)
    Обычные сокеты явлются блокирующими вызовами то есть до завершения отправки пакета выполнение программы приостанавливается и она переходит в состояние ожидания.
    Это совсем не нижний уровень.
    Т.е после send программа либо отправила пакет и он получен другой стороной либо неполучен и возвращен код ошибки.
    Именно по этому обычно открывают такие сокеты на сервере в отдельных потоках чтобы блокировка одного не вызывала блокировки другого.
     
  18. --oleg

    --oleg Well-Known Member

    Joined:
    Dec 20, 2001
    Messages:
    4,414
    Location:
    Russia
    Эээ... Ты, извиняюсь, из какого болота вылез??? Сокет может быть блокирующим, а может асинхронным (т.е. неблокирующим). В любом случае, это тоже не имеет никакого отношения к тому, один порт требуется или два. Ты бы все-таки РТФМ, прежде чем спорить-то, а?
     
  19. PressLuftHammer

    PressLuftHammer FH Beta Tester

    Joined:
    Mar 5, 2003
    Messages:
    15,084
    Location:
    Ekaterinburg (Russia)
    Это ввинде есть неблокирующие сокеты работающие на сообщениях расширение WSA. Изначально же были только блокирующие сокеты.