PDA

Просмотр полной версии : Траблы с Winsock


denjf
12.05.2010, 23:16
procedure TForm1.Button1Click(Sender: TObject);
var
Form1: TForm1;
info: WSADATA;
sin: sockaddr_in;
myip: PHostEnt;
sHwnd: integer;
sBuff1:string;
sBuff, rBuff: array [0..5000] of char;
begin
WSAStartup(makeword(1,1),info);
sHwnd:=Socket(AF_INET, SOCK_STREAM, 0);
sin.sin_family:=AF_INET;
sin.sin_port:=htons(80);
sin.sin_addr.S_addr:=inet_addr('213.33.198.214');
connect(sHwnd, sin, sizeof(sin));
sbuff1:='GET / HTTP/1.1'+ #13#10 +
'Accept:application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/x-shockwave-flash, application/x-esobi, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*'+ #13#10 +
'Accept-Language:ru-RU'+ #13#10 +
'User-Agent:Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; GTB6.4; MRA 5.6 (build 03278); SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; eSobiSubscriber 2.0.4.16)'+ #13#10 +
'Accept-Encoding:gzip, deflate'+ #13#10 +
'Host:odnoklassniki.ru'+ #13#10 +
'Connection:Keep-Alive'+ #13#10+#13#10;


CopyMemory(@sBuff,pchar(sBuff1),length(sBuff1));

send(sHwnd, sBuff, Length(sBuff), 0);
recv(sHwnd, rBuff, Length(rBuff), 0);
Memo1.Lines.Add(rBuff);
end;

Что не так сделал??
Код взял тут на форуме.
В мемо добавляется пустая строка в результате.
Использую Delphi 10

crystalbit
12.05.2010, 23:19
проверяй для начала то, что возвращают функции

посмотри тут (http://parsers.info/2010/01/winsock-http-zapros-s-pomoshhyu-blokiruyushhego-soketa/)

denjf
12.05.2010, 23:22
проверяй для начала то, что возвращают функции

посмотри тут (http://parsers.info/2010/01/winsock-http-zapros-s-pomoshhyu-blokiruyushhego-soketa/)

Я так делал, мурыжил долго.

Если делаю запрос к parsers.info в консоле возвращает знаки вопроса в 2 строчке. К другим сайтам вообще не че не возвращает и ошибку не где не выдает.

wolmer
12.05.2010, 23:25
Если делаю запрос к parsers.info в консоле возвращает знаки вопроса в 2 строчке
Попробуй убрать заголовки которые начинаются на "Accept"

denjf
12.05.2010, 23:28
Попробуй убрать заголовки которые начинаются на "Accept"

Эфект такой же. Может дело в Delphi 2010??

Chrome~
12.05.2010, 23:46
Удали строчку
'Accept-Encoding:gzip, deflate'+ #13#10 +
и будет тебе счастье.

denjf
13.05.2010, 06:18
Удали строчку
'Accept-Encoding:gzip, deflate'+ #13#10 +
и будет тебе счастье.

sbuff1:='GET / HTTP/1.1'+ #13#10 +
'User-Agent:Mozilla/4.0'+ #13#10 +
'Host:odnoklassniki.ru'+ #13#10 +
'Connection:Keep-Alive'+ #13#10+#13#10;

Эфекта ноль(((

M_script_
13.05.2010, 10:23
sbuff1:='GET / HTTP/1.1'+ #13#10 +
'User-Agent:Mozilla/4.0'+ #13#10 +
'Host:odnoklassniki.ru'+ #13#10 +
'Connection:Keep-Alive'+ #13#10+#13#10;

так:
sbuff1:='GET / HTTP/1.1'+ #13#10 +
'User-Agent: Mozilla/4.0'+ #13#10 +
'Host: odnoklassniki.ru'+ #13#10 +
'Connection: Keep-Alive'+ #13#10+#13#10;

denjf
13.05.2010, 10:41
так:

Не работает!

slesh
13.05.2010, 10:44
снифер в руки и вперед за родину.

CopyMemory(@sBuff,pchar(sBuff1),length(sBuff1));
send(sHwnd, sBuff, Length(sBuff), 0);
recv(sHwnd, rBuff, Length(rBuff), 0);

это код полный пздц.
Отправляй данный сразу из строки, без промежуточного буфера.
А вот когда считываешь, то указывай не Length(rBuff) а размер буфера в байтах. или юзай sizeof

denjf
13.05.2010, 11:15
снифер в руки и вперед за родину.

CopyMemory(@sBuff,pchar(sBuff1),length(sBuff1));
send(sHwnd, sBuff, Length(sBuff), 0);
recv(sHwnd, rBuff, Length(rBuff), 0);

это код полный пздц.
Отправляй данный сразу из строки, без промежуточного буфера.
А вот когда считываешь, то указывай не Length(rBuff) а размер буфера в байтах. или юзай sizeof

send(sHwnd, sBuff1[1], Length(sBuff), 0);


recv(sHwnd, rBuff, sizeof(rBuff), 0);
Memo1.Lines.Add(rBuff);

PS Только начал изучать винсок.

Вот что вернулось в ответ 訄

В Delphi 7 все работает!!! А в 2010 нихера (((

greki_hoy
13.05.2010, 11:36
send(sHwnd, sBuff1[1], Length(sBuff), 0);


recv(sHwnd, rBuff, sizeof(rBuff), 0);
Memo1.Lines.Add(rBuff);

PS Только начал изучать винсок.

Вот что вернулось в ответ 訄

странно а должно было быть нарушение доступа
получится примерно так
movsx eax, byte ptr[buffer + 1]
push eax
//... передается не адрес а символ к тому же расширенный в итоге там нечто такого 0x000000df
а запись по такому адресу отловится скорее всего как запись в память отведенную для перехвата нулевых уакзателей а если символ был 0xff получится такой адрес 0xffffffff
напишите так
send(sHwnd, sBuff1, strlen(sBuff), 0);
sBuff1[1] это разыменование а нужен адрес и индексация с нуля не забываем

denjf
13.05.2010, 11:54
странно а должно было быть нарушение доступа
получится примерно так
movsx eax, byte ptr[buffer + 1]
push eax
//... передается не адрес а символ к тому же расширенный в итоге там нечто такого 0x000000df
а запись по такому адресу отловится скорее всего как запись в память отведенную для перехвата нулевых уакзателей а если символ был 0xff получится такой адрес 0xffffffff
напишите так
send(sHwnd, sBuff1, strlen(sBuff), 0);
sBuff1[1] это разыменование а нужен адрес и индексация с нуля не забываем


Проблема не в коде, я поставил Delphi7 все отлично работает, тоже самое в 2010 не хочет не в какую.

denjf
13.05.2010, 17:15
repeat
FillChar(buf,SizeOf(buf),0);
d:=recv(Socket1,buf,SizeOf(buf),0);

for i:=1 to d do html:=html+utf8toansi(buf[i]);
memo1.Lines.Add(html);
until d<=0;

Пытаюсь получить весь HTML код страницы, получаю но из цикла почему то не выходит.

PS/ Задолбал заторможеный idhttp =)

Chrome~
13.05.2010, 17:23
Пытаюсь получить весь HTML код страницы, получаю но из цикла почему то не выходит.

PS/ Задолбал заторможеный idhttp =)
Во первых: idHTTP, это компонент из библиотеки Indy.
Во вторых: ты тут Winsock используешь, а не Indy.
В третьих:
for i:=1 to d do html:=html+utf8toansi(buf[i]);
memo1.Lines.Add(html);
Это вообще неправильный вывод данных в Memo.

Так что еще раз пересмотри свою мысль и пойми, кто "заторможеный".

denjf
13.05.2010, 17:46
Во первых: idHTTP, это компонент из библиотеки Indy.
Во вторых: ты тут Winsock используешь, а не Indy.
В третьих:
for i:=1 to d do html:=html+utf8toansi(buf[i]);
memo1.Lines.Add(html);
Это вообще неправильный вывод данных в Memo.

Так что еще раз пересмотри свою мысль и пойми, кто "заторможеный".


Я не много не правельно выразил мысль про idhttp, это было сказанно к тому что он заторможенный по сравнению с winsock, поэтому я решил научится работать с winsock.

for i:=1 to d do html:=html+utf8toansi(buf[i]);
memo1.Lines.Add(html);

Почему не правельно? В мемо я получаю то что надо. Но немогу понять почему цикл так и продолжает работать.

Chrome~
13.05.2010, 18:03
Я не много не правельно выразил мысль про idhttp, это было сказанно к тому что он заторможенный по сравнению с winsock, поэтому я решил научится работать с winsock.

for i:=1 to d do html:=html+utf8toansi(buf[i]);
memo1.Lines.Add(html);

Почему не правельно? В мемо я получаю то что надо. Но немогу понять почему цикл так и продолжает работать.
idHTTP нормально работает, если им правильно пользоваться.
Все очень просто.
Этот код
repeat
FillChar(buf,SizeOf(buf),0);
d:=recv(Socket1,buf,SizeOf(buf),0);

for i:=1 to d do html:=html+utf8toansi(buf[i]);
memo1.Lines.Add(html);
until d<=0;
есть неправильным в том смысле, что ты постоянно добавляешь данные к переменной html, и выводишь ее в Memo. Получается, что некоторая часть страница в Memo будет отображаться несколько раз. В общем, надо перед цыклом for написать
html := '';
Цикл продолжает выполняться потому, что нужно в отправляемых заголовках написать не
Connection:Keep-Alive
А
Connection: close