Russian Qt Forum

Qt => Работа с сетью => Тема начата: olympian от Май 23, 2010, 14:12



Название: Проблема с сокетами в Windows.
Отправлено: olympian от Май 23, 2010, 14:12
Здравствуйте.

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

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

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

Подскажите, в каком направлении копать надо, и сталкивался ли кто-либо с подобным?


Название: Re: Проблема с сокетами в Windows.
Отправлено: BRE от Май 23, 2010, 14:52
А не в кодировках ли дело?


Название: Re: Проблема с сокетами в Windows.
Отправлено: olympian от Май 23, 2010, 14:57
Нет. Проблема в том, что в сокете который отправляется - ~9.2кб,а на клиент приходит ~1.4кб...


Название: Re: Проблема с сокетами в Windows.
Отправлено: BRE от Май 23, 2010, 14:59
Нет. Проблема в том, что в сокете который отправляется - ~9.2кб,а на клиент приходит ~1.4кб...
А это точно все данные приходят?
Возможно происходит фрагментация пакетов, т.е. 1.4кб это только первая порция данных.


Название: Re: Проблема с сокетами в Windows.
Отправлено: olympian от Май 23, 2010, 15:03
хм... А вот об этом я не подумал. Сейчас проверю.


Название: Re: Проблема с сокетами в Windows.
Отправлено: olympian от Май 23, 2010, 15:45
Так - проверил, видимо ошибка действительно в этом.

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

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


Название: Re: Проблема с сокетами в Windows.
Отправлено: SimpleSunny от Май 23, 2010, 16:21
Это стандартное и описанное поведение ТСП сокета.
Поэтому сначала читайте 2 байта, а потом уже ждите прихода всех данных.

UPD. Хотя прочитал невнимательно. Или вы неверно определяете размер пришедших данных или неверно отсылаете первый пакет. Посмотрите сниффером, что и как приходит клиенту.


Название: Re: Проблема с сокетами в Windows.
Отправлено: olympian от Май 23, 2010, 16:49
Проверяю размер я таким образом:

int c = tSocket->bytesAvailable();

или он выдает не размер?


Название: Re: Проблема с сокетами в Windows.
Отправлено: ритт от Май 23, 2010, 17:37
мм...кривой код?