Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2009.07.26;
Скачать: [xml.tar.bz2];

Вниз

Програмно сделать GET запрос веб серверу и получить ответ.   Найти похожие ветки 

 
test ©   (2009-05-20 08:44) [40]

Дмитрий С ©   (20.05.09 05:36) [39]
И опять же проще через Indy там оно реализовано в понятном юзабельном виде.


 
Тимохов_   (2009-05-20 14:34) [41]


> Дмитрий С ©   (20.05.09 05:36) [39]


Слушай. Скажи, а как настраиваются всякие прокси в HTTPRequest?
Или он работает через IE и настройки берутцо оттуда?


 
Dimka Maslov ©   (2009-05-20 15:20) [42]

Вся это байда суть надстройка над сокетами. Ими и надо пользоваться.


 
Медвежонок Пятачок ©   (2009-05-20 15:21) [43]

И опять же проще через Indy там оно реализовано в понятном юзабельном виде.

Пока перед тобой не появляется нтлм прокси


 
Медвежонок Пятачок ©   (2009-05-20 15:23) [44]

неудобство IXMLHTTPRequest - невозможно получить нотификации прогресса даунлоада


 
@!!ex ©   (2009-05-20 15:29) [45]

Сделал свою реализацию UDP.. Видимо что-то я недопонял...

unit uUDP;

interface
uses WinSock;

const
 UDP_BUFFER_MAX_SIZE = 65507;

type
 TUDPBuffer = record
   Data:array[0..UDP_BUFFER_MAX_SIZE-1] of char;
   Size:integer;
   IP:integer;
   Port:integer;
 end;

 TUDPServer = class
 protected
   FListeningPort:integer;
   FSocket:TSocket;
 public
   Constructor Create(Port:integer);
   Destructor  Destroy; override;
   Function    RecvData(var Buffer:TUDPBuffer):boolean;
   Procedure   SendData(Buffer:TUDPBuffer);
 end;

Function GetIPFromString(const IP:string):integer;

implementation
uses Dialogs;

{ TUDPServer }

Function GetIPFromString(const IP:string):integer;
begin
 Result:=inet_addr(PChar(IP));
end;

constructor TUDPServer.Create(Port: integer);
var
 buffer:WSAData;
 addr:sockaddr_in;
 Arg:u_long;
begin
 FListeningPort:=Port;
 if (WSAStartup($101,buffer)<>0) then
   ShowMessage("WSASturtup error");
 FSocket:=socket(AF_INET,SOCK_DGRAM,0);
 if FSocket=Invalid_Socket then
   ShowMessage("Invalid Socket");

 addr.sin_family:=AF_INET;
 addr.sin_addr.S_addr:=INADDR_ANY;
 addr.sin_port:=htons(FListeningPort);
 if (bind(FSocket,addr,sizeof(addr))<>0) then
   ShowMessage("Bind error");

 Arg:=1;
 IOCtlSocket(FSocket,FIONBIO,Arg);
end;

destructor TUDPServer.Destroy;
begin
 closesocket(FSocket);
 WSACleanup();
 inherited;
end;

var SockAddrSize:integer = Sizeof(TSockAddr);

function TUDPServer.RecvData(var Buffer: TUDPBuffer): boolean;
var
 Arg:u_long;
 AddrFrom:TSockAddr;
begin
 Result:=false;
 IOCtlSocket(FSocket,FIONREAD,Arg);
 if Arg>0 then begin
   Buffer.Size:=RecvFrom(FSocket,Buffer.Data,UDP_BUFFER_MAX_SIZE,0,AddrFrom,SockAdd rSize);
   Buffer.IP:=AddrFrom.sin_addr.S_addr;
   Buffer.Port:=AddrFrom.sin_port;
   Result:=true;
 end;
end;

procedure TUDPServer.SendData(Buffer: TUDPBuffer);
var
 AddrTo:sockaddr_in;
begin
 AddrTo.sin_addr.S_addr:=Buffer.IP;
 AddrTo.sin_port:=Buffer.Port;
 SendTo(FSocket,Buffer.Data,Buffer.Size,0,AddrTo,SockAddrSize);
end;

end.


 
@!!ex ©   (2009-05-20 21:17) [46]

Код использования:
var
 Socket:TUDPServer = nil;

procedure TMainForm.Button1Click(Sender: TObject);
begin
 Socket:=TUDPServer.Create(20000);
end;

procedure TMainForm.Button2Click(Sender: TObject);
var
 Buffer:TUDPBuffer;
begin
 Socket:=TUDPServer.Create(20001);
 Sleep(1000);
 Buffer.Data:="Test Message"#0;
 Buffer.Size:=Length("Test Message"#0);
 Buffer.IP:=GetIPFromString("127.0.0.1");
 Buffer.Port:=20000;
 Socket.SendData(Buffer);
end;

procedure TMainForm.Timer1Timer(Sender: TObject);
var
 Buffer:TUDPBuffer;
begin
 if Assigned(Socket) then begin
   while(Socket.RecvData(Buffer)) do
     ShowMessage(Buffer.Data);
 end;
end;


На одной стороне создаетс яодин сервер, на другой - второй. и отсылается сообщение... Вот только не приходит оно почему то...


 
@!!ex ©   (2009-05-20 21:19) [47]

Судя по мониторингу сети порты на прослушивание открываются.


 
Slym ©   (2009-05-21 05:07) [48]

вах.. зочем UDP неблокирующий?
недостатки чтения по таймеру - потеря пакетов при переполнении буфера, а буфер то небольшой
в поток его и калбек ему в руки!
вот без потока (консольке нафик)... но переделать RecvLoop в потоке а тама калбек...
program UDP;

{$APPTYPE CONSOLE}

uses
 SysUtils,WinSock,Windows;

resourcestring
 sWindowsSocketError = "Windows socket error: %s (%d), on API ""%s""";
procedure RaiseSocketError(const Op: string);
var Error:integer;
begin
 Error := WSAGetLastError;
 raise Exception.CreateResFmt(@sWindowsSocketError, [SysErrorMessage(Error), Error, Op]);
end;

procedure WriteLnEx(const Text:string;color:byte=FOREGROUND_GREEN);
var
 hStdOut:THandle;
 BufferInfo:TConsoleScreenBufferInfo;
 Result:DWORD;
 Attrs: array of word;
 i:integer;
begin
 hStdOut:=GetStdHandle(STD_OUTPUT_HANDLE);
 Win32Check(GetConsoleScreenBufferInfo(hStdOut,BufferInfo));
 SetLength(Attrs, Length(Text));
 for I:=low(Attrs) to high(Attrs) do Attrs[I]:=color;
 Writeln(Text);
 Win32Check(WriteConsoleOutputAttribute(hStdOut, @Attrs[0], Length(Text), BufferInfo.dwCursorPosition, Result));
end;

procedure RecvLoop(sock: TSocket);
const BufSize:integer=$ffff;
var
 buf: PChar;
 from: TSockAddr;
 Size,fromlen: integer;
begin
 fromlen:=SizeOf(TSockAddr);
 GetMem(buf, bufsize);
 try
   while true do
   begin
     Size:=recvfrom(sock, buf^, BufSize, 0, from, fromlen);
     if Size<> SOCKET_ERROR then
     begin
       WriteLnEx(inet_ntoa(from.sin_addr)+":"+inttostr(ntohs(from.sin_port))+" write:");
       WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), buf, dword(Size), dword(Size), nil);
     end else RaiseSocketError("recvfrom");
   end;
 finally
   FreeMem(buf);
 end;
end;

var
 WSAData: TWSAData;
 sock:TSocket;
 addr:TSockAddrIn;
begin
 WSAStartup(MakeWord(1, 0), WSAData);
 sock:=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
 addr.sin_family:= AF_INET;
 addr.sin_addr.S_addr:= htonl(INADDR_ANY);
 addr.sin_port:= htons(3052);
 WriteLnEx("Listening "+inttostr(ntohs(addr.sin_port))+" port...",FOREGROUND_RED);
 bind(sock, addr, SizeOf(addr));
 RecvLoop(sock);
 closesocket(sock);
 WSACleanup;
end.


 
Дмитрий С ©   (2009-05-21 05:41) [49]


> Тимохов_   (20.05.09 14:34) [41]
>
>
> > Дмитрий С ©   (20.05.09 05:36) [39]
>
>
> Слушай. Скажи, а как настраиваются всякие прокси в HTTPRequest?
>
> Или он работает через IE и настройки берутцо оттуда?

Беруться настройки IE. Пароль на прокси, если надо, спросит.


 
@!!ex ©   (2009-05-21 13:29) [50]

> [48] Slym ©   (21.05.09 05:07)
> вах.. зочем UDP неблокирующий?
> недостатки чтения по таймеру - потеря пакетов при переполнении
> буфера, а буфер то небольшой

У меня не больше 100 килобайт в секунду.. это две датаграммы... врядли переполнится.

Я непойму почему мой код не хочет отсылать пакет...


 
Slym ©   (2009-05-21 14:00) [51]

@!!ex ©   (21.05.09 13:29) [50]
У меня не больше 100 килобайт в секунду.. это две датаграммы... врядли переполнится.

мягко говоря раздолбайский подход...
@!!ex ©   (21.05.09 13:29) [50]
Я непойму почему мой код не хочет отсылать пакет...

а у тебя ошибка в 17 строке
а всетаки может принимать? ты мой код повесь и посмотри сыпятся пакеты или нет


 
Slym ©   (2009-05-21 14:20) [52]

function HostToAddr(const AHost:string):Longint;
Var Host:PHostEnt;
begin
Result:=inet_addr(PChar(AHost));
if Result=INADDR_NONE then
begin
  Host:=GetHostByName(PChar(AHost));
  if Host<>nil then
    Result:=PInAddr(Host^.h_addr^)^.S_addr;
end;
end;

procedure SendHelloWorld;
var
 WSAData: TWSAData;
 sock:TSocket;
 addr:TSockAddrIn;
 s:string;
begin
 s:="hello world";
 WSAStartup(MakeWord(1, 0), WSAData);
 sock:=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
 addr.sin_family:= AF_INET;
 addr.sin_addr.S_addr:= HostToaddr("127.0.0.1");
 addr.sin_port:= htons(3052);
 SendTo(sock,s[1],length(s),0,addr,SizeOf(addr));
 CloseSocket(Sock);
 WSACleanup;
end;


 
@!!ex ©   (2009-05-21 14:50) [53]

> [51] Slym ©   (21.05.09 14:00)
> мягко говоря раздолбайский подход...

Что в нем раздолбайского?
Если я знаю что апдейт идет 5 раз в секунду и объем данных не превышает две полных датаграммы в секунду, это раздолбайский подход?

> [51] Slym ©   (21.05.09 14:00)
> а у тебя ошибка в 17 строке

Мимо кассы. Я привел ВЕСЬ код, который есть в демке. Заисключением стандартного dpr.


 
Вариант   (2009-05-21 15:50) [54]


> @!!ex ©   (21.05.09 14:50) [53]


> Если я знаю что апдейт идет 5 раз в секунду и объем данных
> не превышает две полных датаграммы в секунду, это раздолбайский
> подход?


Не верный подход (но это личное мнение конечно).


>  Buffer.Port:=20000;


где htons?


> SendTo(FSocket,Buffer.Data,Buffer.Size,0,AddrTo,SockAddrSize);


Анализ результата этой функции показал бы тебе, что данные не отправляются...


>  AddrTo.sin_addr.S_addr:=Buffer.IP;
>  AddrTo.sin_port:=Buffer.Port;
>  SendTo(FSocket,Buffer.Data,Buffer.Size,0,AddrTo,SockAddrSize);
>


Нет
AddrTo.sin_family := AF_INET;


 
Slym ©   (2009-05-21 16:36) [55]

Вариант   (21.05.09 15:50) [54]
Не верный подход (но это личное мнение конечно).

еще студентом я издевался над лаборантами в универе заваливая их сетевые игры простым флудом пакетов на порт игры в которую они гамали...

простым флудом такой дениал оф сервис тебе сделаю


 
blackman ©   (2009-05-21 17:28) [56]

ShellExecute(Handle, "open", pchar("http://its_your_site.ru/library/DelphiWorld.zip"), "", "", SW_SHOWNORMAL);
:-)


 
@!!ex ©   (2009-05-21 18:29) [57]

> [55] Slym ©   (21.05.09 16:36)
> Вариант   (21.05.09 15:50) [54]
> Не верный подход (но это личное мнение конечно).
> еще студентом я издевался над лаборантами в универе заваливая
> их сетевые игры простым флудом пакетов на порт игры в которую
> они гамали...
>
> простым флудом такой дениал оф сервис тебе сделаю

Если на комп валится куча флуда, то
во-первых постоянный забор данных не спасет - просто тупо кончится канал.
А во-вторых - это решается другими средствами - файерволлами, например.


 
Slym ©   (2009-05-22 06:15) [58]

@!!ex ©   (21.05.09 18:29) [57]
во-первых постоянный забор данных не спасет - просто тупо кончится канал.

но твой способ валится на трафике в десятки раз ниже ширины канала...
мои расчеты:
допустим размер буфера 8кб,
выбираешь 5 раз в сек по 1 датаграмме размером (это фантастика) 8к
(реальный размер <MTU, а принято отправлять не более 512байт!)
итого имееи 8*5=40кб/сек.

если злоумышленник будет посылать по 20 пакетов по 512байт в секунду ты получишь DoS уже серез 1 сек
1сек: 512*(20-5)=7680 данных в буфере
2сек: 512*(20-5)+7680= 15360 данных но все что не влезет в буфер игнорится
DOS с паразитной нагрузкой на канал 10кб/сек. что даже ниже полезного трафика


 
Вариант   (2009-05-22 07:19) [59]


> @!!ex ©   (21.05.09 18:29) [57]

Про флуд я не писал. Про ширину канала,флуд и прочее в этом плане - я честно говоря и не думал. Ибо тот код, что ты привел -это тест "а как работает эта функция", не более - но вещь нужная, когда знакомишься с новым для себя.  Я высказал свое мнение, хотя это обобщенный вариант моего видения - как работать (или не работать) с сетью. У тебя может быть свой взгляд и много зависит от задачи. Тебе писать программу, тебе и решать как работать.



Страницы: 1 2 вся ветка

Форум: "Прочее";
Текущий архив: 2009.07.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.58 MB
Время: 0.471 c
15-1242940174
DillerXX
2009-05-22 01:09
2009.07.26
О теме КПК


9-1181478232
Eugewik
2007-06-10 16:23
2009.07.26
При условии несколько действий


2-1243948042
jz
2009-06-02 17:07
2009.07.26
изменялся ли checkbox


6-1205446069
IFrau Randt
2008-03-14 01:07
2009.07.26
NMHTTP


2-1243960373
v1kee
2009-06-02 20:32
2009.07.26
Помогите с динамическим созданием строк





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский