Russian Qt Forum
Ноябрь 24, 2024, 00:42 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с сокетами в Windows.  (Прочитано 3964 раз)
olympian
Гость
« : Май 23, 2010, 14:12 »

Здравствуйте.

Могли бы вы подсказать, в чем может быть проблема. Ситуация такова:
есть функция у сервера - получает строку(QString) и шлет ее на клиент. Он ее принимает и обрабатывает. Размер строки - менее 10кб. На компьютерах с Linuxom(арч, убунту) - всё прекрасно работает. Но стоило проверить на ноуте с Win7 так появилась проблема. Ни клиент, ни сервер не работают.

Сервер:
 Специально проверил - перед отправкой он получает нужную строку, шлет, а клиент(и на винде, и на линухе) не получают ее - получают сигнал что пришло сообщение, но он сильно отличается от отправленного.

Клиент:
  Если клиенту, пущенному под виндой послать сообщение с сервера под линухом - он также получает какую-то фигню, к делу не относящуюся..

Подскажите, в каком направлении копать надо, и сталкивался ли кто-либо с подобным?
Записан
BRE
Гость
« Ответ #1 : Май 23, 2010, 14:52 »

А не в кодировках ли дело?
Записан
olympian
Гость
« Ответ #2 : Май 23, 2010, 14:57 »

Нет. Проблема в том, что в сокете который отправляется - ~9.2кб,а на клиент приходит ~1.4кб...
Записан
BRE
Гость
« Ответ #3 : Май 23, 2010, 14:59 »

Нет. Проблема в том, что в сокете который отправляется - ~9.2кб,а на клиент приходит ~1.4кб...
А это точно все данные приходят?
Возможно происходит фрагментация пакетов, т.е. 1.4кб это только первая порция данных.
Записан
olympian
Гость
« Ответ #4 : Май 23, 2010, 15:03 »

хм... А вот об этом я не подумал. Сейчас проверю.
Записан
olympian
Гость
« Ответ #5 : Май 23, 2010, 15:45 »

Так - проверил, видимо ошибка действительно в этом.

Но теперь появился другой вопрос:
  на клиент приходит 2 пакета подряд. На сервере данные к отправке я готовлю так: 2 байта на размер пакета, потом данные.
А приходит - 1 пакет: 1400кб, в котором есть первые 2 байта, а остальные 1398(гдет) байт - пустые. (он  в QByteArray не выводит). А 2й пакет - нужного мне размера, и с нужными мне данными.

Могли бы объяснить, в чем причина столь странного поведения?
на линуксе такого странного поведения нету.
Записан
SimpleSunny
Гость
« Ответ #6 : Май 23, 2010, 16:21 »

Это стандартное и описанное поведение ТСП сокета.
Поэтому сначала читайте 2 байта, а потом уже ждите прихода всех данных.

UPD. Хотя прочитал невнимательно. Или вы неверно определяете размер пришедших данных или неверно отсылаете первый пакет. Посмотрите сниффером, что и как приходит клиенту.
« Последнее редактирование: Май 23, 2010, 16:24 от SimpleSunny » Записан
olympian
Гость
« Ответ #7 : Май 23, 2010, 16:49 »

Проверяю размер я таким образом:

int c = tSocket->bytesAvailable();

или он выдает не размер?
Записан
ритт
Гость
« Ответ #8 : Май 23, 2010, 17:37 »

мм...кривой код?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 21.