![]() |
|
Модераторы: feodorv |
![]()
|
|
| Athlon |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 100 Регистрация: 15.1.2006 Где: Украина:: Запорож ье Репутация: нет Всего: нет |
Есть у меня две программы которые общаются строками через сокеты. Для этого создал два класса производных от CSocket и отправляю стороки с помощью Send(), а в OnReceive() принимаю. Вроде бы проще некуда, но когда начал тестировать обнаружил интересный баг - клиент иногда принимает несколько строк как одну.
Что бы это могло быть и как с этим явлением бороться |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: нет Всего: 146 |
Имхо буфер сокета набирает данные и когда он (буфер) переполняется он его выпихивает в сокет (в сеть) , в твоем случае делать принудительное выталкивание данных, что то типа как для файла flush или делать задержки между отправкой сенд (таймауты),
и второй вариант забить на все это, и вставлять в строке, символ конца строки (свой допустим "+") , а при выводе на экран заменять этот символ на перевод строки -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| Athlon |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 100 Регистрация: 15.1.2006 Где: Украина:: Запорож ье Репутация: нет Всего: нет |
Romikgy, вариант с разделителем строки конечно интересный, но ты лучше подскажи как сделать
|
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: нет Всего: 146 |
Чье это счастье , что за среда , VC? хелпнадо смотреть найду его подскажу чтото -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| Athlon |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 100 Регистрация: 15.1.2006 Где: Украина:: Запорож ье Репутация: нет Всего: нет |
После утомительных поисков нашел выход - отключить алгоритм Нейгла (который по возможности объединяет мелкие сообщения до размера сегмента). Отключаю его следующим способом:
Но все равно сообщения которые я отправляю клиенту в цикле, например так:
все также с приходят то по отдельности то вместе. Может есть еще вариант заставить сокет отправлять сообщения немедленно или я что-то делаю неправильно? P.S. Romikgy, речь идет о CSocket из MFC, а среда разработки MS VC 6.0 |
||||
|
|||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: нет Всего: 146 |
Можно еще посоветовать
SO_SNDBUF поставить в 1 и с SO_SNDTIMEO поигратся У меня этого нет так что ничего не подскажу, да и лично я не люблю VC и его MFC имхо тупой он. +Имхо лучше сделать с разделителями строк! да еще можешь попробывать ставить задержки после этого , допустим на 10 мсек, может поможет -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| ptr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 661 Регистрация: 31.5.2006 Где: Новосибирск Репутация: 9 Всего: 14 |
Athlon выложи код приёма, отправки сообщений.
-------------------- Единственный способ определить границы возможного - это выйти за эти границы, в невозможное. Артур Кларк. |
|||
|
||||
| Athlon |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 100 Регистрация: 15.1.2006 Где: Украина:: Запорож ье Репутация: нет Всего: нет |
Я в принципе уже решил вопрос вводом разделителя строки, и почитав умную книгу понял что это самый правильный способ (http://www.syt.edu.severodvinsk.ru/znai/megabook/internet/tcp-ip/gl3/gl3.html - совет 15). Но если интересно могу выложить.
Серверный сокет наследуется от CSocket и отправляет строковые сообщения функцией предка Send
а клиент принимает сообщения в обработчике OnReceive - вот код клиентского сокета:
в начальной версии не было цикла while для разбивки на строки по разделителю. P.S. Только не над лекций о том что нужно всеми правдами и неправдами избегать switch. |
||||
|
|||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: нет Всего: 146 |
И че не работает так как надо ?
-------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| Artemon |
|
|||
|
а ты мне нравишься ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1771 Регистрация: 24.2.2004 Где: Челябинск Репутация: 1 Всего: 20 |
Чего следует избегать, так это посылки строк.
Самый надежный вариант посылать буфер. -------------------- Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |