Собственно у меня два вопроса:
1) Если я получил пакет от сервера обязательно ли сразу слать на него ответ, или можно передать какой-то другой, а затем послать ответ на пришедший пакет.
2) Вопрос архитектурный и напрямую зависит от первого:
Получается у меня есть два потока RxThread и TxThread: при использовании синхронных сокетов socket.Receive() блокирует RXThread до приема данных, когда данные пришли , блокируем поток TxThread парсим входные данные и отправляем ответ. После этого разблокируем TxThread и снова ждем данных. Данный подход жизнеспособен или нет ?
Я очень плохо разбираюсь в сетевом программировании, поэтому прошу помощи.
ПС: пробовал изучать исходники L2NET бота, код сильно фрагментирован и плохочитаемый.
Ты сейчас спрашиваешь относительно ла2, или просто пытаешься создавать свое независимое клиент-серверное приложение?
В большинстве случае нет смысла блокировать потоки, их единственно нужно синхронизировать при работе с общими данными.
не знаю как здесь, в моем случае клиент мог получить большой кусок информации за один раз, где были бы слеплены несколько пакетов. следовательно программа должна была читать весь этот кусок до конца, а не первые 2 байта по определению id пакета и весь кусок считать как один пакет. то есть надо было каждый приход инфы гонять по циклу - а ровняется ли пакет всему куску? если нет, сдвигать маркер по куску до конца первого пакета и начинать читать второй.
то есть на практике, если в клиенте нет функционала по отслеживанию этого момента - то предположим сервер шлет инфу клиенту о движении танка и о выстреле танком, то клиент примет инфу что танк двигается, а вот выстрел может тупо не обработать если он придет в том - большом куске.
я думаю в л2пх этим моментом - что в одном куске инфы может быть несколько пакетов и объясняется что порой в листинге некоторые пакеты появляются оптом сразу штук 5 очень быстро. я думаю что инфа пришла оптом в одном куске информации, а л2пх разобрал её по пакетам и выдал как разные пакеты, пришедшие по очереди.
друг, учись выражать свои мысли. Мне пришлось прочитать три раза, чтобы понять что у тебя склеиваются пакеты. Мои вопросы, то совсем о другом.
Добавлено через 3 минуты
Цитата:
Сообщение от ScythLab
В большинстве случае нет смысла блокировать потоки, их единственно нужно синхронизировать при работе с общими данными.
У меня и так почти все переменные пишутся через lock{}.. или ты предлагаешь лочить сокет ?
Добавлено через 3 минуты
и кто-нибудь наконец обьясните : ответы на некоторые пришедшие с сервера пакеты имеют больший приоритет, чем пакеты инициированные клиентом? Или равноценны? Просто от этого зависит куда их ставить: в начало или конец очереди
Последний раз редактировалось i_am_kisly, 31.03.2015 в 22:43.
Причина: Добавлено сообщение
Все пакеты равнозначны, все их ставишь в очередь и по порядку обрабатываешь, если пакет требует ответа, то отвечаешь на него и переходишь к обработке следующего пакета в очереди и т.д. Лочить нить не нужно, правильного lock вполне достаточно.
И если мы все же говорим про ла2, то могут быть нюансы защит (хотя конечно я могу путать), некоторые защиты отправляют свои данные для проверки подлинности клиента, вот если на этот пакет не ответить во время, то может быть принудительный дисконнект, но опять-таки повторюсь - могу перепутать, возможно сервер отваливался по таймауту, если не получал ответ на свой запрос.
Добавлено через 2 минуты
И вообще по поводу отправки данных, они все происходят в одной нити, так что возможно клиент вначале обрабатывает все полученные данные от сервера и только потом переходит к опросу мыши/клавы/учету макросов
Все пакеты равнозначны, все их ставишь в очередь и по порядку обрабатываешь, если пакет требует ответа, то отвечаешь на него и переходишь к обработке следующего пакета в очереди и т.д.
Мне кажется, что это lurkmore.to/Взаимоисключающие_параграфы
Если все пакеты la2 (без защит) равнозначны, то ответ на пакет становится в конец очереди. Но дальше ты пишешь, что ответ вставляется в начало очереди, а значит пакеты "ответов" имеют явный проритет. На лицо явное противоречие.
Мне кажется, что это lurkmore.to/Взаимоисключающие_параграфы
Если все пакеты la2 (без защит) равнозначны, то ответ на пакет становится в конец очереди. Но дальше ты пишешь, что ответ вставляется в начало очереди, а значит пакеты "ответов" имеют явный проритет. На лицо явное противоречие.
В клиенте ла2 только одна очередь пакетов для входящих данных, они принимаются в отдельном потоке и складываются в очередь. Дальше в главном потоке в общем цикле происходит несколько действий:
1) обработка принятых пакетов;
2) обработка действий пользователя;
3) просчет и отрисовка игрового мира.
При обработке входящих пакетов данные вытаскиваются из очереди (надеюсь теперь мы уяснили что это за очередь?) и обрабатываются, если пакет требует ответа, то идет моментальный ответ (грубо говоря идет вызов wsock32.send), и переходим к следующему пакету пока очередь не опустеет.
Какая последовательность работы вышеуказанных блоков я не знаю.