Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
[Delphi][Sockets] проблемы с получением изображения |

04.08.2008, 07:42
|
|
Познавший АНТИЧАТ
Регистрация: 16.11.2004
Сообщений: 1,257
Провел на форуме: 1331503
Репутация:
454
|
|
[Delphi][Sockets] проблемы с получением изображения
Прошу помочь разобраться а то я че-то торможу не могу понять откуда берется г **но.
Delphi. Uses WinSock.
TCP. Connect на 80 порт, GET, save to file.
Код:
function wsrecvstring(mailsocket:TSocket; var L:Longint):string;
var
buffer:array[1..64000] of byte;
i:integer;
buffstr:string;
begin
buffstr:='';
fillchar(buffer,sizeof(buffer),0);
l:=winsock.recv(mailsocket,buffer[1],sizeof(buffer),0);
if L>0 then
for i:=1 to L do
begin
buffstr:=buffstr+chr(buffer[i]);
end;
try
result:=buffstr;
except
result:='';
end;
end;
...
heads:='';
heads:=wsrecvstring(mysock,L);
np:=1;
repeat
s:=wsrecvstring(mysock,L);
heads:=heads+s;
until l<1;
При этом в полученном содержимом (для хтмл-страниц оно неипет, а вот бинарники засирает)
иногда появляются конструкции вида
13#10 //CRLF
послед_3-4_символа
13#10 //CRLF
это типа слитно.
Например
HTTP/1.1 200 OK
...
Content-Type: image/jpeg
1000
яШяа JFIF...
- ср **ая тысяча
потом в том эе файле еще раз она же, потом f56, 5321, и в разных файлах свое. В конце 0 и неско CRLF подрял.
Откуда берется не ясно.
Данные (картинки и тестовые до 25кб - остальные не пробовал) с сервера приходят одним цельным пакетом (когда-то сталкивался с тем что на некоторых серваках заголовок идет одним пакетом, данные остальными, потом увидел что это не обязательно
и если это криво склеивать вместе...
хотя у меня не криво
heads:=heads+s; без мусора.
).
Может кто видел это раньше?
PS: предложения типа юзай wininet/indy/nm/fp не принимаются. Надо на сокетах и только.
Последний раз редактировалось Jes; 04.08.2008 в 12:43..
Причина: ;)
|
|
|

04.08.2008, 11:07
|
|
Познающий
Регистрация: 06.08.2007
Сообщений: 36
Провел на форуме: 373639
Репутация:
10
|
|
У меня тоже была такая хня и до сих пор есть на некоторых HTTP серверах... непонятно откуда она берется.. но я бы посоветовал почитать rfc
|
|
|

04.08.2008, 13:22
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме: 3288241
Репутация:
3349
|
|
лучше читай чуть по другому.
Код:
var
buffer:array[0..64000] of byte;
i:integer;
buffstr:string;
begin
buffstr:='';
repeat
l:=winsock.recv(mailsocket,buffer,sizeof(buffer),0);
buffstr:=buffstr+copy(buffer,1,l);
until l<=0;
result:=buffstr;
может быть чуть не правильно. нет компилятора под рукой проверить.
но примерно так ты скачаешь полностью всё что прислал сервер.
А на счет тысячи - хз сам встречался что добавляют.
|
|
|

04.08.2008, 15:09
|
|
Познавший АНТИЧАТ
Регистрация: 16.11.2004
Сообщений: 1,257
Провел на форуме: 1331503
Репутация:
454
|
|
В принципе да, copy(buffer,1,l);.
Но я же говорю, все приходит одним пакетом!!!
Лажа находится в середине пакета, прочитанного за 1 вызов recv().
Вот в чем проблема.
Неужели приййдется юзать WSARecv? я ж это ненавижу...
Вот заюзал wsaRecvEx(), теперь каждый файл состоит из 2 кусков, опять тысяча в начале и все, 2-3 лажи во втрором куске и ноль в конце...
Как с этим браузеры борятся, не могу понять.
И никогда раньше не слышал о том что сервер может вставлять куски хлама в данные. Только заголовки!
Последний раз редактировалось vvs777; 04.08.2008 в 15:15..
|
|
|

04.08.2008, 23:17
|
|
Познающий
Регистрация: 09.04.2008
Сообщений: 51
Провел на форуме: 147993
Репутация:
74
|
|
это протокол Http/1.1 Imho
попробуй как то заставить работать в Http/1.0, там этого нет
(как - не знаю, но это определятся запросом Get)
|
|
|

05.08.2008, 09:39
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме: 3288241
Репутация:
3349
|
|
дык это и есть в запросе
GET /image.jpg HTTP/1.0 или GET /image.jpg HTTP/1.1
|
|
|

05.08.2008, 09:55
|
|
Познающий
Регистрация: 09.04.2008
Сообщений: 51
Провел на форуме: 147993
Репутация:
74
|
|
ну правильно, но я же не знаю как он там (или кто за него) запросы формирует 
вчера кстати попробовал загружать картинки с нескольких серверов, никто в режиме HTTP/1.1 чанки не использовал %( vvs777 дай пример сервера с которым у тебя "проблемы"
|
|
|

09.08.2008, 02:40
|
|
Познавший АНТИЧАТ
Регистрация: 16.11.2004
Сообщений: 1,257
Провел на форуме: 1331503
Репутация:
454
|
|
Нашел в чем дело, топик можно закрывать.
в логи если глянуть - Chunked. Вот его надо было обрабатывать.
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|