![]() |
|
Модераторы: Snowy, Poseidon, MetalFan |
![]()
|
|
| MaDCoD |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 8.5.2006 Репутация: нет Всего: нет |
У меня возник вопрос:
Я получаю странички через WinSock, обчным GET запросом. (Через Send) Всё нормально получается, пока не встретиться нулевой символ в приходящем пакете. Я так понял WinSock решает, что это конец данных и перестаёт принимать данные. Эта же проблема актуальна например при получении картинок через WinSock, так как там часто встречаются эти 00h.. Собстно сам вопрос, кто-нибудь уже сталкивался с такой ситуацией и как её можно исправить? Это сообщение отредактировал(а) MaDCoD - 17.11.2008, 11:21 |
|||
|
||||
| Matematik |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1027 Регистрация: 11.3.2006 Репутация: 24 Всего: 50 |
> Я так понял WinSock решает, что это конец данных и перестаёт принимать данные.
Неверно. > Я получаю странички через WinSock, обчным GET запросом Имеется в виду HTTP протокол? Там много нюансов с передачей данных. Вобщем без кода помочь не получиться. |
|||
|
||||
| MaDCoD |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 8.5.2006 Репутация: нет Всего: нет |
Да, конечно по HTTP передаю, вот пример кода:
Основная процедура передачи:
Функция:
Создание сокета:
ip, ставится принадлежащий сайту естественно И ещё смотря через сниффер, отлавливаю весь пакет который приходит, вместе с нулевыми символами, но после RecBuf(S,buf); Загружаю ответ в поток с последующим сохранением в файл или в мемо с предварительным преобразованием в строку через StrPas, и там и там пакет получается обрезанным после нулевых символов. |
||||||
|
|||||||
| Virtuals |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 476 Регистрация: 27.11.2006 Репутация: 2 Всего: 11 |
MaDCoD,
ничего в голову не приходит?
избегай использовать PChar и просто_стринг, лучше array of char а еще лучше array of Byte Это сообщение отредактировал(а) Virtuals - 18.11.2008, 06:19 |
|||
|
||||
| MaDCoD |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 8.5.2006 Репутация: нет Всего: нет |
Virtuals,
Так строки у меня практически нигде и не используются, buf объявлен как TBuf, который array[0..131070]of char, опять же при загрузке например в поток не должно препятствовать наличие нулевых символов ведь так? :
Ни как не пойму в каком месте, прекращается приём пакета.. Это сообщение отредактировал(а) MaDCoD - 18.11.2008, 08:31 |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 14 Всего: 128 |
MaDCoD,
а можно код в более читаемо отформатировать? а то не читается никак) -------------------- There are always someone smarter than you... |
|||
|
||||
| MaDCoD |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 8.5.2006 Репутация: нет Всего: нет |
MetalFan, так?))
|
|||
|
||||
| Qu1nt |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 602 Регистрация: 13.1.2007 Репутация: 2 Всего: 50 |
Это сообщение отредактировал(а) Qu1nt - 18.11.2008, 15:22 |
|||
|
||||
| MaDCoD |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 8.5.2006 Репутация: нет Всего: нет |
Qu1nt,
другой выход тоже выход)) Но мне интересно, что именно в моём коде не позволяет загрузить данные после нулевого символа. Виноват 99% он, т.к. ту же страницу вики мой код тоже грузит на ура, как и любую другую страничку, проблема появляется призагрузке картинки через сокет (site.ru/cat/img.png например), как исправить? |
|||
|
||||
| Qu1nt |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 602 Регистрация: 13.1.2007 Репутация: 2 Всего: 50 |
В справку по strlen. И не забудь воспользоваться результатом RecBuf
Это сообщение отредактировал(а) Qu1nt - 18.11.2008, 18:52 |
|||
|
||||
| Virtuals |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 476 Регистрация: 27.11.2006 Репутация: 2 Всего: 11 |
MaDCoD, ну как о стенку горохом... "практически " не значит нигде
Qu1nt, прав, если внимательней посмотреть в strlen, то будет видно, что в вашем случае он ищет #00 и считает что это конец! вот примерчик с кучей граблев Qu1nt тоже посмотри, там хорошо видно что copy может тоже пролет устроить
соответственно в вашем коде нужно buf[buflen]:=#0 никчему это inplen:=RecBuf(S,buf); ms.Write(buf,strlen(buf)); ms.Write(buf,inplen); {либо page:=StrPas(buf);
Это сообщение отредактировал(а) Virtuals - 19.11.2008, 07:59 |
||||
|
|||||
| darkmamba |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 98 Регистрация: 16.10.2008 Репутация: 1 Всего: 1 |
народ подскажите куда копать может подскажите готовое уже решение, начал недавно совсем изучать делфи и пишу щас програмку что то типо бота, вообщем соединяюсь с сервером, мне приходит пакет приветствия, на него я должен ответить правильным пакетом(ну это все проза), проблема щас для меня - какой тип переменных использовать под буфер принятых данных? стринг неподходит потомучто после нулевых символов строка обрезается, хотя когда писал чекер серверов на udp мне это немешало парсить пакеты, а с TCP все встало боком... нужно для отладки выводить принятый пакет, или хотябы быть уверенным что входящий пакет целиком принят, чтоб дальше работать с ним.. использовать тип стринг неподходит а с другими я работать неумею ^^, имхо идеальный вариант array of byte но как мне его вывести в любом виде (hex или ASCII или символы, главное чтоб полностью) в тот же мемо например, и как работать с этим типом, может литературу какуюнибуть подскажете или какихнибуть исходников подкинете, желательно VCL т.к я только учусь... опыта практически нет...использую компонент Tsocketclient.
Это сообщение отредактировал(а) darkmamba - 20.11.2008, 14:56 |
|||
|
||||
| Virtuals |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 476 Регистрация: 27.11.2006 Репутация: 2 Всего: 11 |
char:=ord(byte) символ по коду string:=inttohex(byte,2) код в виде хекс размером 2 символа darkmamba, |
|||
|
||||
| darkmamba |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 98 Регистрация: 16.10.2008 Репутация: 1 Всего: 1 |
Virtuals, спасибо пригодилось!
щас решил проблему с обрезанием пакета делал так
но мне кажется это гимор для кода, и он будет тормазить при приеме больших пакетов и если их будет много... |
|||
|
||||
| Virtuals |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 476 Регистрация: 27.11.2006 Репутация: 2 Всего: 11 |
darkmamba, тебе правильно кажется, неоптимально!
посмотри в сторону move прочти тему очень внимательно сначала! и уйди от pkt :string; иначе нарвешся на pkt:='a'+#0+'3'; length(pkt) =1 Это сообщение отредактировал(а) Virtuals - 22.11.2008, 20:46 |
|||
|
||||
![]()
|
| Правила форума "Delphi: Сети" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |