С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual Basic
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
ulikus
0 / 0 / 0
Регистрация: 13.07.2011
Сообщений: 2
1

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

17.07.2011, 02:12. Просмотров 1185. Ответов 9
Метки нет (Все метки)

Привет!
короче проблема в том что когда посылаешь несколько пакетов подряд то они содиняются в один.
тоесть:
1. ааа 2. ббб 3. ввв 4. ггг
а приходит
1. ааа 2. бббввв 3. ггг
ну понятно короче
есть ли в insock возможность что бы при получении пакета, получатель отправлял подтверждение и отлько после этого отсылался следущий пакет что бвы они негде не смешивались.
тут этот вопрос уже поднимался но ничего так так и не ответили
Заранее благодарю
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.07.2011, 02:12
Ответы с готовыми решениями:

При использовании read или readln строка ввода опускается все ниже-ниже. Как-то этого избежать?
При каждом использовании будь то read или readln строка ввода опускается все...

При любом действии сбрасываются переменные. Как этого избежать
У меня проблема небольшая. Пишу приложение ASP.net, при любой действии...

При нажатии стрелок фокус передаётся по компонентам на форме. Как этого избежать ?
Приветствую! Мне необходимо сделать так, чтобы при нажатии стрелок фокус не...

Как создать динамичный поддомен на Joomla, если сам действующий сайт статичен и избежать при этом дублей?
Добрый день! очень надеюсь на дельный совет от профессионалов -- имеется...

DbCtrlGrid: при скролле до конца автоматически создается новая пустая запись. Как этого избежать?
Уважаемые форумчане! Столкнулся с проблемой при работе с DBCtrlGrid: при...

9
Alexey Spirin
1 / 1 / 1
Регистрация: 18.10.2007
Сообщений: 1,750
17.07.2011, 03:00 2
вопрос, если не ошибаюсь, я и поднимал.
Решение нашел, может и не самое лучшее, но все же...
В конце каждого пакета вставляешь такой символ, котоырй не может встречаться в пакете, и при получении разбиваешь (Split), по этому символу. Работает на ура.
0
ulikus
0 / 0 / 0
Регистрация: 13.07.2011
Сообщений: 2
17.07.2011, 21:38 3
Привет!
Проблема заключается в том что split у меня и так уже исползуется так как пакеты содержат много информации то есть:
команда, данные, данные... и везде разные команды и количесво данных
сама программа карточная игра и эта проблема возникает только при раздаче карт когда клиенты посылается информация о картах несколько раз подряд из for loopа
0
Akula-II
0 / 0 / 0
Регистрация: 02.01.2011
Сообщений: 149
21.07.2011, 23:38 4
Предлогаю следующий вариант:

Winsock1.SendData 'abcdefg'
do until snd=True
doevents
loop
Winsock1.SendData 'zzzzzz'
End Sub

Winsock1_SendComplete()
snd=True
end sub
0
Mz@2
1 / 1 / 0
Регистрация: 22.04.2011
Сообщений: 47
26.07.2011, 00:48 5
Не знаю, как WinSocket Control - я его никода не применяю - работаю только через API. Так вот, если отправитель всегда ждет подтверждения получения пакета со стороны клиента в виде какого - либо ответного пакета, никакого 'склеивания' не происходит. Даже наоборот, иногда мои пакеты (когда их размеры превышают пару десятков килобайт) начинают дробиться. Но это не проблема, потому что первое слово в моем пакете всегда указывает длину пакета. В случае дробления принимающая сторона, просто вызывает recv столько раз, пока не прочтется указанное в первом слове пакета количество байт.
0
Jonis
16.08.2011, 07:26 6
Только что сам закончил писать небольшой sql server. Эту проблему решил так же, как было описано выше. Перед отправкой строки в начало добавляю длину строки (в результате отправляемая строка увеличивается скажем на 10 символов в которых и хранится длина всей строки). Теперь достаточно взять первые 10 симвлов, перевести их в число и сравнить с длиной. Если совпадает, то обрабатываю текст начиная с 11 символа, если нет, то обрезаю по заданной длине. В случае если пакеты слеплены в один, обрабатываю вначале целые пакеты, а не полный помещаю в буфер (в дополнительную переменную). При следующем приеме склеиваю текст из буфера с тем что пришло и т.д.
Если длина отправляемого текста свыше лимита для контрола WINSOCK, то текст режится на куске и отправляется кусками, при этом длина текста отправляется только в первом пакете.
В данном случае нет ограничений на отправляемые данные двоичные они или текстовые (в двоичных может попасться код конца строки). Вот и все.

Евгений
Jonis
16.08.2011, 07:49 7
Хочу добавить про API. Он тоже склеивает пакеты, в случае последовательной отправки нескольких пакетов одному и тому же клиенту во время ожидания ответа о получении предыдущего пакета (это какие-то доли секунд).
В связи с проблемой работы WinSock API на 98 винде и переодического его краха пришлось отказаться и перейти к готовому контролу. В результате связь с подключенными клиентами стала стабильной и клиенты перестали отрубаться по непонятным причинам.
Irokez
16.08.2011, 16:44 8
Простите что вмешиваюсь.
А что мешает два раза сделать сплит.
1 разделить пакеты
2 разделить комманды в каждом из них
Jonis
16.08.2011, 21:04 9
Почему использование сплит затрудняет работу при получении склеенных пакетов:
В случае отправки(получения) двоичных данных есть вероятность появления в строке данных набора символов соответствующих набору символов/символа являющихся разделителем. К примеру, если используете сжатие/кодирование данных, то после этой лперации данные будут представлены не только текстовыми символами.

Jonis
Messir
16.08.2011, 21:33 10
Размер буфера посылки выставлять равным размеру пакета
16.08.2011, 21:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.08.2011, 21:33

Canvas или как сделать покраснение экрана при получении урона
Нашел урок по "как сделать покраснение экрана при получении урона". Но он...

при вызове конструктора присваивания надо возвращать ссыль на объект или сам объект. Смысл? Значения нужных полей меняютмся и без этого!
Друзья! Обнаружил пробел в знаниях. Собсно, вопрос в теме. Дополню лишь: поля...

Рисование на виртуальной канве или как избежать мигания при рисовании
Суть проблемы в следующем: На канве рисуется очень большой и сложный чертеж,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru