Russian Qt Forum

Qt => Работа с сетью => Тема начата: boobsik от Август 17, 2009, 20:20



Название: QTcpSocket конец данных
Отправлено: boobsik от Август 17, 2009, 20:20
как узнать, что сокет на другом конце больше ничего не собирается писать в мой?
чтобы я начал писать ему? искал сигналы типа readyRead(), но наоборот =) не нашел.. надо просто узнать, что данным пришел конец, чтобы начать их обрабатывать..


Название: Re: QTcpSocket конец данных
Отправлено: BRE от Август 17, 2009, 20:24
как узнать, что сокет на другом конце больше ничего не собирается писать в мой?
чтобы я начал писать ему? искал сигналы типа readyRead(), но наоборот =) не нашел.. надо просто узнать, что данным пришел конец, чтобы начать их обрабатывать..
Вот для этого и придумывают всяческие протоколы.  ;)

Это тебе решать, как разработчику, как одна сторона будет сообщать другой о завершении передачи. Можно указывать длину передаваемых данных в начале, можно присылать какую нибудь метку в конце.... Много чего еще можно придумать.


Название: Re: QTcpSocket конец данных
Отправлено: kuzulis от Август 17, 2009, 20:26
упс.. опередили


Название: Re: QTcpSocket конец данных
Отправлено: boobsik от Август 17, 2009, 20:32
я так понимаю, что если речь идет о html или любом другом текстовом файле, то символом конца файла будет '\0' ?  :)


Название: Re: QTcpSocket конец данных
Отправлено: BRE от Август 17, 2009, 20:40
я так понимаю, что если речь идет о html или любом другом текстовом файле, то символом конца файла будет '\0' ?  :)
Ну там все чуть посложней.  ;)
http://ru.wikipedia.org/wiki/HTTP


Название: Re: QTcpSocket конец данных
Отправлено: boobsik от Август 17, 2009, 20:58
значит если в по хттп протоколу в теле передается картинка или другая фигня, то шлется Content-Length: в заголовке, а если это текстовый(*.html, *.htm, *.php, *.js и.т.д.) то конец тела обозначается символом '\0'! Правильно? =)


Название: Re: QTcpSocket конец данных
Отправлено: ритт от Август 17, 2009, 20:58
я так понимаю, что если речь идет о html или любом другом текстовом файле, то символом конца файла будет '\0' ?  :)
lol
с каких пор html - протокол? ;)


Название: Re: QTcpSocket конец данных
Отправлено: ритт от Август 17, 2009, 20:59
значит если в по хттп протоколу в теле передается картинка или другая фигня, то шлется Content-Length: в заголовке, а если это текстовый(*.html, *.htm, *.php, *.js и.т.д.) то конец тела обозначается символом '\0'! Правильно? =)
неправильно. там вообще строки разделяются по crlf.
тебе ссылку зря дали? - читай.


Название: Re: QTcpSocket конец данных
Отправлено: boobsik от Август 17, 2009, 21:01
lol
с каких пор html - протокол? ;)
хттп)) читать внимательней надо  ;D

за ссылку спасибо, буду вкуривать))


Название: Re: QTcpSocket конец данных
Отправлено: BRE от Август 17, 2009, 21:06
за ссылку спасибо, буду вкуривать))
Вот здесь по забористей: http://book.itep.ru/4/45/http4561.htm
 :)


Название: Re: QTcpSocket конец данных
Отправлено: boobsik от Август 17, 2009, 21:10
за ссылку спасибо, буду вкуривать))
Вот здесь по забористей: http://book.itep.ru/4/45/http4561.htm
 :)
кстати ценный ресурс, жаль по irc ничего)


Название: Re: QTcpSocket конец данных
Отправлено: BlackTass от Август 18, 2009, 09:33
Если протокол уже готовый и менять его нелзья, а по какой-то причине в нем нет длины тела пакета, то можно воспользоваться эвристическим приемом:
1. Принимаем первую порцию данных
2. Ждем n-ное время
3. Если пришло то принимаем и опять на пункт 2. Если не пришло то считаем что данные закончились.

Число n подбирается исходя из ожидаемой ширины канала (для обычного русского интернета хватает числа 1,5 секунды)


Название: Re: QTcpSocket конец данных
Отправлено: boobsik от Август 18, 2009, 09:36
в http 1.1 видимо "эвристический прием" не подойдет)) там за одними данными сразу могут идти другие)


Название: Re: QTcpSocket конец данных
Отправлено: pastor от Август 18, 2009, 11:14
Я с ходу не могу себе представить кто и в каких случаях будет применять т.н. "эвристический прием". Ведь его надежность 0.


Название: Re: QTcpSocket конец данных
Отправлено: BlackTass от Август 18, 2009, 18:35
Я с ходу не могу себе представить кто и в каких случаях будет применять т.н. "эвристический прием". Ведь его надежность 0.
Диалоговый протокол. Самое оно. Хотя лучше чем размер пакета не придумано конечно ничего.


Название: Re: QTcpSocket конец данных
Отправлено: kuzulis от Август 18, 2009, 19:59
Ну в принципе можно использовать маркеры начала и конца передачи, если размер принимаемого пакета неизвестен, да и не факт, что первое принятое значение будет являтся значением длины пакета данных  .. т.о. можно оч промахнутся :)

Вы скажите сначала для чего вы будете использовать сокеты (т.к. ничего не сказано о целях) - а по результатам ваших ответов уже мы может быть поможем с выбором протокола обмена :)


Название: Re: QTcpSocket конец данных
Отправлено: boobsik от Август 18, 2009, 22:04
я хочу написать прокси сервер для анализа веб трафика. Пока только веб, но меня интересует возможность анализа и других протоколов в перспективе, поэтому сейчас  нахожусь в размышлении как организовать загрузку данных.. Пока остановился на том, что каждая транзакция будет происходить в отдельном потоке, в голове плавают мысли об интерфейсе для загрузки данных из сокета loader, который будет принимать в конструкторе ссылку на сокет и на массив байтов, но вот только не совсем понимаю, как под этот интерфейс подставить нужного наследника интерфейса... ведь для того, чтобы за интерфейсом скрывался нужный класс необходимо сначала прочитать первые данные, а потом уже вызвать конструктор.. может быть кто-нибудь подскажет ссылку на UML диаграмку? хотелось бы сделать подставку нужного класса, необходимо красивое решение )