Вернуться   CoderX :: Forums > Основные форумы > Программинг
Войти через OpenID

Программинг Форум для тем связанных с программированием

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 31.03.2015, 16:53   #1
Новичок
 
Регистрация: 13.11.2014
Сообщений: 20
Сказал Спасибо: 2
Имеет 1 спасибку в 1 сообщении
i_am_kisly пока неопределено
По умолчанию порядок передачи пакетов

Собственно у меня два вопроса:
1) Если я получил пакет от сервера обязательно ли сразу слать на него ответ, или можно передать какой-то другой, а затем послать ответ на пришедший пакет.
2) Вопрос архитектурный и напрямую зависит от первого:
Получается у меня есть два потока RxThread и TxThread: при использовании синхронных сокетов socket.Receive() блокирует RXThread до приема данных, когда данные пришли , блокируем поток TxThread парсим входные данные и отправляем ответ. После этого разблокируем TxThread и снова ждем данных. Данный подход жизнеспособен или нет ?

Я очень плохо разбираюсь в сетевом программировании, поэтому прошу помощи.
ПС: пробовал изучать исходники L2NET бота, код сильно фрагментирован и плохочитаемый.
i_am_kisly вне форума   Ответить с цитированием
Старый 31.03.2015, 18:29   #2
Местный
 
Аватар для ScythLab
 
Регистрация: 24.10.2014
Сообщений: 190
Сказал Спасибо: 4
Имеет 42 спасибок в 40 сообщенях
ScythLab пока неопределено
По умолчанию

Ты сейчас спрашиваешь относительно ла2, или просто пытаешься создавать свое независимое клиент-серверное приложение?
В большинстве случае нет смысла блокировать потоки, их единственно нужно синхронизировать при работе с общими данными.
__________________
Хобби: разработка бота для Lineage.
ScythLab вне форума   Ответить с цитированием
Старый 31.03.2015, 18:38   #3
Новичок
 
Регистрация: 13.11.2014
Сообщений: 20
Сказал Спасибо: 2
Имеет 1 спасибку в 1 сообщении
i_am_kisly пока неопределено
По умолчанию

относительно ла2 на примере некоторого абстрактного сферического oog бота в вакууме По существу есть что-нибудь ?

Последний раз редактировалось i_am_kisly, 31.03.2015 в 18:48.
i_am_kisly вне форума   Ответить с цитированием
Старый 31.03.2015, 21:37   #4
Местный
 
Аватар для SeregaZ
 
Регистрация: 16.08.2009
Сообщений: 1,224
Сказал Спасибо: 4
Имеет 229 спасибок в 182 сообщенях
SeregaZ пока неопределено
По умолчанию

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

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

я думаю в л2пх этим моментом - что в одном куске инфы может быть несколько пакетов и объясняется что порой в листинге некоторые пакеты появляются оптом сразу штук 5 очень быстро. я думаю что инфа пришла оптом в одном куске информации, а л2пх разобрал её по пакетам и выдал как разные пакеты, пришедшие по очереди.
__________________
хочу картинку в подпись!
SeregaZ вне форума   Ответить с цитированием
Старый 31.03.2015, 22:43   #5
Новичок
 
Регистрация: 13.11.2014
Сообщений: 20
Сказал Спасибо: 2
Имеет 1 спасибку в 1 сообщении
i_am_kisly пока неопределено
По умолчанию

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

Добавлено через 3 минуты
Цитата:
Сообщение от ScythLab Посмотреть сообщение
В большинстве случае нет смысла блокировать потоки, их единственно нужно синхронизировать при работе с общими данными.
У меня и так почти все переменные пишутся через lock{}.. или ты предлагаешь лочить сокет ?

Добавлено через 3 минуты
и кто-нибудь наконец обьясните : ответы на некоторые пришедшие с сервера пакеты имеют больший приоритет, чем пакеты инициированные клиентом? Или равноценны? Просто от этого зависит куда их ставить: в начало или конец очереди

Последний раз редактировалось i_am_kisly, 31.03.2015 в 22:43. Причина: Добавлено сообщение
i_am_kisly вне форума   Ответить с цитированием
Старый 31.03.2015, 23:40   #6
Местный
 
Аватар для ScythLab
 
Регистрация: 24.10.2014
Сообщений: 190
Сказал Спасибо: 4
Имеет 42 спасибок в 40 сообщенях
ScythLab пока неопределено
По умолчанию

Все пакеты равнозначны, все их ставишь в очередь и по порядку обрабатываешь, если пакет требует ответа, то отвечаешь на него и переходишь к обработке следующего пакета в очереди и т.д. Лочить нить не нужно, правильного lock вполне достаточно.
И если мы все же говорим про ла2, то могут быть нюансы защит (хотя конечно я могу путать), некоторые защиты отправляют свои данные для проверки подлинности клиента, вот если на этот пакет не ответить во время, то может быть принудительный дисконнект, но опять-таки повторюсь - могу перепутать, возможно сервер отваливался по таймауту, если не получал ответ на свой запрос.

Добавлено через 2 минуты
И вообще по поводу отправки данных, они все происходят в одной нити, так что возможно клиент вначале обрабатывает все полученные данные от сервера и только потом переходит к опросу мыши/клавы/учету макросов
__________________
Хобби: разработка бота для Lineage.

Последний раз редактировалось ScythLab, 31.03.2015 в 23:40. Причина: Добавлено сообщение
ScythLab вне форума   Ответить с цитированием
Старый 01.04.2015, 01:55   #7
Новичок
 
Регистрация: 13.11.2014
Сообщений: 20
Сказал Спасибо: 2
Имеет 1 спасибку в 1 сообщении
i_am_kisly пока неопределено
По умолчанию

Цитата:
Сообщение от ScythLab Посмотреть сообщение
Все пакеты равнозначны, все их ставишь в очередь и по порядку обрабатываешь, если пакет требует ответа, то отвечаешь на него и переходишь к обработке следующего пакета в очереди и т.д.
Мне кажется, что это lurkmore.to/Взаимоисключающие_параграфы
Если все пакеты la2 (без защит) равнозначны, то ответ на пакет становится в конец очереди. Но дальше ты пишешь, что ответ вставляется в начало очереди, а значит пакеты "ответов" имеют явный проритет. На лицо явное противоречие.
i_am_kisly вне форума   Ответить с цитированием
Старый 01.04.2015, 02:01   #8
Местный
 
Аватар для Yegor
 
Регистрация: 05.04.2009
Сообщений: 1,436
Сказал Спасибо: 306
Имеет 122 спасибок в 98 сообщенях
Yegor пока неопределено
По умолчанию

Нет никакого приоритета. Есть 2 пула. На прием и на отправку пакетов.

Читаешь очередной пакет. Обрабатываешь его. В случае необходимости добавляешь ответный пакет в конец очереди на отправку на сервер. Все.

Да и вообще там всего пару пакетов которые требуют какого то ответа серверу. NetPing и GGQuery, вроде и все.
__________________
Продажа чистых аккаунтов 4G, L2 EU, AARu, AA EU, Aion EU, Tera RU, Tera EU (ICQ 594297609)
Продажа VK авторег аккаунтов (ICQ 594297609)
Yegor вне форума   Ответить с цитированием
За это сообщение Yegor нажился спасибкой от:
Старый 01.04.2015, 02:04   #9
Новичок
 
Регистрация: 13.11.2014
Сообщений: 20
Сказал Спасибо: 2
Имеет 1 спасибку в 1 сообщении
i_am_kisly пока неопределено
По умолчанию

Алилуйа ! Спасибо за внятное обьяснение
i_am_kisly вне форума   Ответить с цитированием
Старый 01.04.2015, 16:13   #10
Местный
 
Аватар для ScythLab
 
Регистрация: 24.10.2014
Сообщений: 190
Сказал Спасибо: 4
Имеет 42 спасибок в 40 сообщенях
ScythLab пока неопределено
По умолчанию

Цитата:
Сообщение от i_am_kisly Посмотреть сообщение
Мне кажется, что это lurkmore.to/Взаимоисключающие_параграфы
Если все пакеты la2 (без защит) равнозначны, то ответ на пакет становится в конец очереди. Но дальше ты пишешь, что ответ вставляется в начало очереди, а значит пакеты "ответов" имеют явный проритет. На лицо явное противоречие.
В клиенте ла2 только одна очередь пакетов для входящих данных, они принимаются в отдельном потоке и складываются в очередь. Дальше в главном потоке в общем цикле происходит несколько действий:
1) обработка принятых пакетов;
2) обработка действий пользователя;
3) просчет и отрисовка игрового мира.
При обработке входящих пакетов данные вытаскиваются из очереди (надеюсь теперь мы уяснили что это за очередь?) и обрабатываются, если пакет требует ответа, то идет моментальный ответ (грубо говоря идет вызов wsock32.send), и переходим к следующему пакету пока очередь не опустеет.
Какая последовательность работы вышеуказанных блоков я не знаю.
__________________
Хобби: разработка бота для Lineage.
ScythLab вне форума   Ответить с цитированием
Ответ

  CoderX :: Forums > Основные форумы > Программинг



Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 02:51.

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!