Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2011, 16:36   #1
MrRockchip
Пользователь
 
Аватар для MrRockchip
 
Регистрация: 30.05.2009
Сообщений: 26
Восклицание Слипаются сообщения в сокетах

Сервер отправляет несколько сообщений в цикле
Цитата:
n=pBox->GetCount();
for (i=0; i<n; i++) {
pBox->GetText(i, s);
send(socket,s,strlen(s),0);
}
Клиенту:
Цитата:
case FD_READ:
len=recv(m_client.m_hSocket,s,1024, 0);
Но в результате сообщения слипаются!

Как сделать так, чтобы они не слипались?
MrRockchip вне форума Ответить с цитированием
Старый 22.04.2011, 17:13   #2
legendary
Форумчанин
 
Аватар для legendary
 
Регистрация: 21.04.2010
Сообщений: 125
По умолчанию

у тебя все слипаться? у меня точно такая же проблема на java, пробивал в цикле ставить задержку таймером - все равно не помогло. Что же делать?
legendary вне форума Ответить с цитированием
Старый 22.04.2011, 17:25   #3
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Как сделать так
> Что же делать?

- вставлять разделитель между сообщениями
- каждое сообщение предварять его длиной
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 22.04.2011, 17:34   #4
legendary
Форумчанин
 
Аватар для legendary
 
Регистрация: 21.04.2010
Сообщений: 125
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
- вставлять разделитель между сообщениями
хорошая мысль!
Цитата:
Сообщение от veniside Посмотреть сообщение
- каждое сообщение предварять его длиной
а код можна?
legendary вне форума Ответить с цитированием
Старый 22.04.2011, 17:51   #5
MrRockchip
Пользователь
 
Аватар для MrRockchip
 
Регистрация: 30.05.2009
Сообщений: 26
По умолчанию

Цитата:
- вставлять разделитель между сообщениями
то есть нужно сделать искусственную задержку, чтобы сеанс передачи заканчивался?
MrRockchip вне форума Ответить с цитированием
Старый 22.04.2011, 18:00   #6
legendary
Форумчанин
 
Аватар для legendary
 
Регистрация: 21.04.2010
Сообщений: 125
По умолчанию

я разделяю сообщения с помощю "\1"(ASCII). все что между "\1"..."\1" и есть сообщения.
legendary вне форума Ответить с цитированием
Старый 22.04.2011, 18:11   #7
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> то есть нужно сделать искусственную задержку, чтобы сеанс передачи заканчивался?

нет, разделитель — это набор байт, который не может встретиться в вашем сообщении. Например 0xFFFFFFFF. Тогда, просканировав принятый поток байт, и найдя в нём такой разделитель можно понять, где закончилось предыдущее и началось новое сообщение. Если разделитель не найден, значит сообщение принято не полностью, и надо ещё раз читать из сокета данные. А отправитель вставляет разделитель после/перед каждым сообщением.

> а код можна?

на яве? не, слабо.. да ну это просто ведь.

На передающей стороне:
1) посылаем 2 байта, длину нашего сообщения (от 0 до 65535, если нужно больше, то договариваемся, что длина занимает не 2, а 4 или больше байт).
2) посылаем само сообщение.

На принимающей стороне:
1) читаем 2 байта (или 4 или сколько решили) из потока, это будет длина сообщения
2) принимаем ровно столько байт из сокета, сколько указано в длине

ТСП — это ведь поток, он не обязан передавать данные ровно теми пачками, которые в него передают на отправляющей стороне. Данные могут прибывать хоть по 1 байту за раз, к этому надо быть готовым. ТСП только гарантирует, что данные прийдут все, и в том порядке, в котором они отосланы. Ну или произойдёт обрыв связи.

В принципе, если сообщения короткие (до 1300 байт), и потеря некоторых из них не очень критична, можно юзать UDP. Там каждое сообщение приходит с той длиной, которая была задана отправителем. Или не приходит, т.к. ЮДП не гарантирует доставки. И даже не гарантирует, что сообщения прийдут в том порядке, в котором были отправлены.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 22.04.2011, 19:10   #8
MrRockchip
Пользователь
 
Аватар для MrRockchip
 
Регистрация: 30.05.2009
Сообщений: 26
Вопрос

Я делаю две программы для чата - типа аська по локальной сети (клиент - сервер)

Если просто посылаешь сообщения: пишешь, жмёшь Enter,
и так несколько раз - ничего не слипается!
(наверное, потому что пока ты пишешь новое сообщение, происходит задержка)

А вот когда сервер синхронизирует список клиентов с новыми клиентами,
он быстро отправляет им много сообщений в цикле - и тут они слипаются!

Значит, задержка всё-таки имеет значение?
И можно сделать небольшую искусственную, порядка миллисекунды?
(чтобы пользователь не заметил)
MrRockchip вне форума Ответить с цитированием
Старый 22.04.2011, 19:56   #9
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

хочется нестандарного секса — добавляйте задержки, авось как-нибудь именно в вашей сети это когда-нибудь заработает.

хочется написать нормальную программу — читайте, что вам пишут.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 23.04.2011, 21:32   #10
MrRockchip
Пользователь
 
Аватар для MrRockchip
 
Регистрация: 30.05.2009
Сообщений: 26
Вопрос

Я попробовал сделать таким образом:

Сервер:
* send - посылает сообщение клиенту ("Важное Сообщение")
* recv - принимает сообщение от клиента ("Сообщение принял! Жду следующего!")
* send - посылает сообщение клиенту ("Важное Сообщение")
* recv - принимает сообщение от клиента ("Сообщение принял! Жду следующего!")

Клиент:
* recv - принимает сообщение от сервера ("Важное Сообщение")
* send - посылает сообщение серверу ("Сообщение принял! Жду следующего!")

Это сделано для того, чтобы как в разговоре между людьми:
если собеседнику нужно сказать несколько фраз, а он говорит, потом слушает, а потом снова говорит,
то его фразы "не сливаются" !


Но на деле почему-то этот процесс рассинхронизируется,
и проги вылетают (повреждены стеки у принимающих переменных, в которые записываются сообщения)

Как это исправить?
Есть ли другие способы оповещения сервера клиентом о приёме сообщения?

Последний раз редактировалось MrRockchip; 23.04.2011 в 22:50.
MrRockchip вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чат на сокетах yandzee Общие вопросы C/C++ 6 11.12.2010 14:50
пакеты в сокетах Lemon2009 Общие вопросы по Java, Java SE, Kotlin 0 10.04.2010 14:32
UDP в сокетах HTL Работа с сетью в Delphi 2 02.04.2010 21:04
Переадресация на сокетах yres51447 Работа с сетью в Delphi 2 29.03.2010 15:01
Авторегистратор на сокетах Astron Работа с сетью в Delphi 5 11.03.2010 12:06