ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Delphi Winsock 1.1 GET
  #1  
Старый 21.11.2009, 21:31
Аватар для Sams
Sams
Участник форума
Регистрация: 18.04.2009
Сообщений: 120
Провел на форуме:
435863

Репутация: 80
По умолчанию Delphi Winsock 1.1 GET

Всем добрый вечер. Работаю с winsock на делфи. Пытаюсь отправить GET запрос на хост, получить ответ и записать его в компонент Memo. Но к сожалению когда доходит очередь до функции recv() - программа просто зависает. В чем моя ошибка? Буду рад любым советам/ответам по теме. Заранее благодарен.

Цитата:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, winsock, StdCtrls;

type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
info: WSADATA;
sin: sockaddr_in;
myip: PHostEnt;
sHwnd: integer;
sBuff, rBuff: string;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
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('77.221.159.154');
connect(sHwnd, sin, sizeof(sin));
sbuff:='GET /article.php?article=1016003 HTTP/1.1' + #13#10 +
'User-Agent: ManualSender/1.0' + #13#10 +
'Host: www.wasm.ru' + #13#10 +
#13#10
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Closesocket(sHwnd);
WSACleanup;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
send(sHwnd, sBuff, Length(sBuff), 0);
recv(sHwnd, rBuff, Length(rBuff), 0); // зависает
Memo1.Lines.Add(rBuff);
end;

end.
P.S. Ответ:"Пиши на АСМ" можете оставить при себе...

P.P.S. Может это из-за того, что буфер для отправки имеет тип string с максимальным размером в 255 символов, а GET занимает больше, в следствии чего передается не полный запрос, на который не приходит ответ? И что тогда лучше использовать для буфера, TStringStream? А Pchar покатит?

Последний раз редактировалось Sams; 21.11.2009 в 21:39..
 
Ответить с цитированием

  #2  
Старый 21.11.2009, 21:44
Аватар для ntldr
ntldr
Постоянный
Регистрация: 04.12.2007
Сообщений: 424
Провел на форуме:
2364957

Репутация: 479
По умолчанию

для буфера не используют string. Лучше pchar а лучше массив из byte.
А самый правильный ответ - запусти программу под отладчиком, и посмотри что происходит в этом месте
 
Ответить с цитированием

  #3  
Старый 21.11.2009, 21:47
Аватар для Sams
Sams
Участник форума
Регистрация: 18.04.2009
Сообщений: 120
Провел на форуме:
435863

Репутация: 80
По умолчанию

Попробовал через PChar. К сожалению результат тот же. Зависает.
 
Ответить с цитированием

  #4  
Старый 21.11.2009, 21:47
Аватар для wolmer
wolmer
Постоянный
Регистрация: 12.05.2009
Сообщений: 395
Провел на форуме:
4761503

Репутация: 229
По умолчанию

Так правильней (писал тут, должно работать):
Код:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, winsock, StdCtrls;

type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
info: WSADATA;
sin: sockaddr_in;
myip: PHostEnt;
sHwnd: integer;
sBuff1:string;
sBuff, rBuff: array [0..5000] of char;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
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('77.221.159.154');
connect(sHwnd, sin, sizeof(sin));
sbuff1:='GET /article.php?article=1016003 HTTP/1.1' + #13#10 +
'User-Agent: ManualSender/1.0' + #13#10 +
'Host: www.wasm.ru' + #13#10 +
#13#10;
CopyMemory(@sBuff,pchar(sBuff1),length(sBuff1));
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Closesocket(sHwnd);
WSACleanup;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
send(sHwnd, sBuff, Length(sBuff), 0);
recv(sHwnd, rBuff, Length(rBuff), 0);
Memo1.Lines.Add(rBuff);
end;

end.
 
Ответить с цитированием

  #5  
Старый 21.11.2009, 21:54
Аватар для Sams
Sams
Участник форума
Регистрация: 18.04.2009
Сообщений: 120
Провел на форуме:
435863

Репутация: 80
По умолчанию

ntldr, спасибо за совет.
wolmer, спасибо! Твой вариант работает. Данные нормально принимает и ничего не виснет. Woohoo Благодарю еще раз
 
Ответить с цитированием

  #6  
Старый 21.11.2009, 22:08
Аватар для Sams
Sams
Участник форума
Регистрация: 18.04.2009
Сообщений: 120
Провел на форуме:
435863

Репутация: 80
По умолчанию

А еще такой вопрос. Что бы получить данные, нужно знать IP:
Цитата:
sin.sin_addr.S_addr:=inet_addr('77.221.159.154');
А каким образом тогда можно реализовать что-то на подобие IdHTTP. Тоесть поле Edit, Button и Memo. Вводишь в Edit ссылку сайта, жмешь на button и результат выводится в Memo. Вся суть в том, как узнать IP, что б подставить в структуру sockaddr_in?

Последний раз редактировалось Sams; 21.11.2009 в 22:41..
 
Ответить с цитированием

  #7  
Старый 21.11.2009, 22:19
Аватар для wolmer
wolmer
Постоянный
Регистрация: 12.05.2009
Сообщений: 395
Провел на форуме:
4761503

Репутация: 229
По умолчанию

Цитата:
Сообщение от Sams  
А каким образом тогда можно реализовать что-то на подобие IdHTTP. Тоесть поле Edit, Button и Memo. Вводишь в Edit ссылку сайта, жмешь на button и результат выводится в Memo. Вся суть в том, как узнать IP, что б подставить в структуру sockadd_in?
Код:
function TForm1.hosttoip(name: string): string;
var
 wsdata  :twsadata;
 hostname:array [0..255] of char;
 hostent :phostent;
 addr    :pchar;
 ip      :string;
begin 
 wsastartup($0101, wsdata);
 try
   gethostname (hostname, sizeof (hostname));
   strpcopy(hostname, name);
   hostent := gethostbyname (hostname);
   if assigned (hostent) then
     if assigned (hostent^.h_addr_list) then
      begin
        addr := hostent^.h_addr_list^;
        if assigned (addr) then
         begin
           ip:=format('%d.%d.%d.%d', [byte (addr [0]),
           byte(addr [1]), byte (addr [2]), byte (addr [3])]);
           result := ip;
         end
        else
           result:='';
      end
     else
        result := ''
   else
    begin
      result := '';
    end;
 finally
   wsacleanup;
 end
end;
(сразу говорю, код не мой, взят с сети)

Пример:
sin.sin_addr.S_addr:=inet_addr(pchar(hosttoip('yan dex.ru')));
{На счет преобр в pchar не уверен. Yandex если что пишется вместе (баг форума)}

Последний раз редактировалось wolmer; 21.11.2009 в 22:27..
 
Ответить с цитированием

  #8  
Старый 21.11.2009, 22:40
Аватар для Sams
Sams
Участник форума
Регистрация: 18.04.2009
Сообщений: 120
Провел на форуме:
435863

Репутация: 80
По умолчанию

Спасибо. Работает. Перепроверил айпи через трассировку

P.S.
Цитата:
На счет преобр в pchar не уверен.
Как раз только через PChar и работает

Последний раз редактировалось Sams; 22.11.2009 в 01:16..
 
Ответить с цитированием

  #9  
Старый 05.03.2010, 00:27
Аватар для zer0ska
zer0ska
Участник форума
Регистрация: 05.12.2007
Сообщений: 113
Провел на форуме:
252598

Репутация: 34
По умолчанию

покажите на примере етого кода как отрезать зоголовки от ответа чтоб получить голы хтмл
 
Ответить с цитированием

  #10  
Старый 05.03.2010, 00:45
Аватар для wolmer
wolmer
Постоянный
Регистрация: 12.05.2009
Сообщений: 395
Провел на форуме:
4761503

Репутация: 229
По умолчанию

Цитата:
Сообщение от zer0ska  
покажите на примере етого кода как отрезать зоголовки от ответа чтоб получить голы хтмл
Код:
memo1.lines.text:=copy(memo1.lines.text, pos(#13#10#13#10, memo1.lines.text)+4, length(memo1.lines.text)-pos(#13#10#13#10, memo1.lines.text));
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Литература Delphi Sams С/С++, C#, Delphi, .NET, Asm 2 19.03.2010 19:46
ASM Winsock 1.1 Sams С/С++, C#, Delphi, .NET, Asm 2 14.11.2009 16:42
Books PSalm69 Избранное 248 27.10.2009 04:52
Virus.Win32.Induc.a или "Снова записки новичка" _=(mac)=_ Защита ОС: вирусы, антивирусы, файрволы. 5 24.08.2009 23:34
Примеры работы Delphi с WinSock gLuk! С/С++, C#, Delphi, .NET, Asm 3 29.03.2009 01:34



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ