Форум: "Прочее";
Текущий архив: 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