Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Траблы с Winsock (https://forum.antichat.xyz/showthread.php?t=203632)

denjf 12.05.2010 23:16

Траблы с Winsock
 
Цитата:

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

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

посмотри тут

denjf 12.05.2010 23:22

Цитата:

Сообщение от crystalbit
проверяй для начала то, что возвращают функции

посмотри тут

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

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

wolmer 12.05.2010 23:25

Цитата:

Сообщение от denjf
Если делаю запрос к parsers.info в консоле возвращает знаки вопроса в 2 строчке

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

denjf 12.05.2010 23:28

Цитата:

Сообщение от wolmer
Попробуй убрать заголовки которые начинаются на "Accept"

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

Chrome~ 12.05.2010 23:46

Удали строчку
Код:

'Accept-Encoding:gzip, deflate'+ #13#10 +
и будет тебе счастье.

denjf 13.05.2010 06:18

Цитата:

Сообщение от Chrome~
Удали строчку
Код:

'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

Цитата:

Сообщение от M_script_
так:

Не работает!

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

Цитата:

Сообщение от slesh
снифер в руки и вперед за родину.

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

Цитата:

Сообщение от denjf
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

Цитата:

Сообщение от greki_hoy
странно а должно было быть нарушение доступа
получится примерно так
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

Цитата:

Сообщение от denjf
Пытаюсь получить весь 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

Цитата:

Сообщение от Chrome~
Во первых: 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

Цитата:

Сообщение от denjf
Я не много не правельно выразил мысль про 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


Время: 00:23