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

Вниз

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

 
@!!ex ©   (2009-05-19 19:06) [0]

Как проще всего сделать?


 
clickmaker ©   (2009-05-19 19:11) [1]

> проще всего

TIdHttp

или функции WinInet


 
@!!ex ©   (2009-05-19 19:13) [2]

Ага. Нашел пример на WinInet. а можно получить файл в буффера, а не на винчестер?


 
clickmaker ©   (2009-05-19 19:18) [3]

а как в примере сразу на винчестер?


 
@!!ex ©   (2009-05-19 19:29) [4]

var
 FileOnNet, LocalFileName: string
begin
 FileOnNet := "http://its_your_site.ru/library/DelphiWorld.zip";
 LocalFileName := "C:\DelphiWorld.zip";

 if GetInetFile(FileOnNet, LocalFileName) = True then
   ShowMessage("Download successful")
 else
   ShowMessage("Error in file download");
end;


 
clickmaker ©   (2009-05-19 19:34) [5]

> GetInetFile

а что это за функция?

собственно, апишная InternetReadFile и читает в буфер


 
@!!ex ©   (2009-05-19 20:22) [6]

Точно! Я не обратил внимание на другую страницу с кодом.
Там как раз GetInetFile и реализовано.


 
@!!ex ©   (2009-05-19 20:59) [7]

Написал функцию... она отрабатывает только ОДИН раз!
При повторных вызовах возвращается старое значение:
function GetTextFileFromHTTP(const fileURL: string): string;
const
 BufferSize = 1024;
var
 hSession, hURL: HInternet;
 Buffer: array[1..BufferSize] of char;
 s:string;
 BufferLen: DWORD;
 f: file;
 sAppName: string;
begin
 Result := "";
 sAppName := ExtractFileName(Application.ExeName);
 hSession := InternetOpen(PChar(sAppName),
 INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
 try
   hURL := InternetOpenURL(hSession, PChar(fileURL), nil, 0, 0, 0);
   try
     repeat
       InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
       s:=Buffer;
       SetLength(s,BufferLen);
       Result:=Result+s;
     until
       BufferLen = 0;
   finally
     InternetCloseHandle(hURL);
   end;
 finally
   InternetCloseHandle(hSession);
 end;
end;


 
Zeqfreed ©   (2009-05-19 21:05) [8]

Кэшируется вестимо.


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

Я так и понял... А как этого избежать?


 
@!!ex ©   (2009-05-19 21:07) [10]

Нашел такой пример:
Uses WinINet;  
и добавить к TButton следующий обработчик btnEmptyCache:  
Procedure TfrmMain.btnEmptyCacheClick( Sender : TObject );  
Var  
   lpEntryInfo : PInternetCacheEntryInfo;  
   hCacheDir   : LongWord;  
   dwEntrySize : LongWord;  
   dwLastError : LongWord;  
Begin  
   dwEntrySize := 0;  
   FindFirstUrlCacheEntry( NIL, TInternetCacheEntryInfo( NIL^ ), dwEntrySize );  
   GetMem( lpEntryInfo, dwEntrySize );  
   hCacheDir := FindFirstUrlCacheEntry( NIL, lpEntryInfo^, dwEntrySize );  
   If ( hCacheDir <> 0 ) Then  
       DeleteUrlCacheEntry( lpEntryInfo^.lpszSourceUrlName );  
   FreeMem( lpEntryInfo );  
   Repeat  
       dwEntrySize := 0;  
       FindNextUrlCacheEntry( hCacheDir, TInternetCacheEntryInfo( NIL^ ), dwEntrySize );  
       dwLastError := GetLastError();  
       If ( GetLastError = ERROR_INSUFFICIENT_BUFFER ) Then Begin  
           GetMem( lpEntryInfo, dwEntrySize );  
           If ( FindNextUrlCacheEntry( hCacheDir, lpEntryInfo^, dwEntrySize ) ) Then  
               DeleteUrlCacheEntry( lpEntryInfo^.lpszSourceUrlName );  
           FreeMem(lpEntryInfo);  
       End;  
   Until ( dwLastError = ERROR_NO_MORE_ITEMS );  
End;


 
@!!ex ©   (2009-05-19 21:09) [11]

одной строчки достаточно:
DeleteUrlCacheEntry( ГКД);


 
@!!ex ©   (2009-05-19 21:09) [12]

ГКД == URL


 
Zeqfreed ©   (2009-05-19 21:10) [13]

InternetOpenUrl + INTERNET_FLAG_PRAGMA_NOCACHE, INTERNET_FLAG_NO_CACHE_WRITE может быть проще? :)

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


 
DVM ©   (2009-05-19 21:31) [14]


> Zeqfreed ©   (19.05.09 21:10) [13]


> Вообще по-моему использовать этот API экплореровский более
> геморно, чем послать две строчки по сокету.

Полностью согласен. Мне вообще непонятно, зачем этот API наворотили сверху. Он не шибко упрощает, а скорее усложняет работу с HTTP.


 
@!!ex ©   (2009-05-19 21:39) [15]

Работа с сетью для меня темный лес, спросил совета, мне ответили. Нашел решение, сделал. :)
Может и лучше сделать на АПИ - но знаний нету...
А это вроде справляется с работой.


 
DVM ©   (2009-05-19 21:42) [16]


> @!!ex ©   (19.05.09 21:39) [15]

А через TIdHttp вообще то же самое чуть ли не одной строкой делается.


 
@!!ex ©   (2009-05-19 21:48) [17]

Ага. Вот только я не знаю где его брать в Explorer"e


 
DVM ©   (2009-05-19 21:50) [18]


> Ага. Вот только я не знаю где его брать в Explorer"e

Там Indy нету что ли? Не знал. Но это тоже не проблема, скачиваешь инди, папочку добавляешь в пути поиска, динамически создаешь его.


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

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

Подскажите статей по реализации обмена сообщениями через UDP.


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

Интересует максимально быстрый способ. Поэтому всякие компоненты использовать не хочется...


 
DVM ©   (2009-05-19 22:02) [21]


> Подскажите статей по реализации обмена сообщениями через
> UDP.

Сообщения сообщениям рознь. Что за сообщения? Нужен ли контроль доставки пакета? Максимально быстро - это без какого либо контроля. На Winsock.


 
тимохов ©   (2009-05-19 22:11) [22]

пользуй wininet. у розыча на сайте есть пример, вполне рабочий.


 
Сергей М. ©   (2009-05-19 22:20) [23]


> максимально быстрый способ. Поэтому всякие компоненты использовать
> не хочется


Задержки, вносимые работой компонентных оболочек UDP-транспорта, ничтожно малы по сравнению со скоростью работы самого транспорта в реальных сетевых условиях.


 
turbouser ©   (2009-05-19 22:23) [24]


> @!!ex ©   (19.05.09 21:52) [19]


> Подскажите статей по реализации обмена сообщениями через
> UDP.

UDP не предназначен для этого.
Расстреливать на месте надо чатописателей, использующих UDP...


 
DVM ©   (2009-05-19 22:28) [25]


> turbouser ©   (19.05.09 22:23) [24]


> UDP не предназначен для этого.

C чего ты взял что ему для чата? А почему бы и нет собственно? Какая разница UDP или TCP. Гарантии доставки только нет.


 
@!!ex ©   (2009-05-19 22:33) [26]


> [21] DVM ©   (19.05.09 22:02)
> Максимально быстро - это без какого либо контроля. На Winsock.

Именно поэтому UDP, а не TCP. Потеря пакетов не критична, скорость приоритетна.


> [22] тимохов ©   (19.05.09 22:11)
> пользуй wininet. у розыча на сайте есть пример, вполне рабочий.

А насколько это быстро по скорости?


> [23] Сергей М. ©   (19.05.09 22:20)
> Задержки, вносимые работой компонентных оболочек UDP-транспорта,
> ничтожно малы по сравнению со скоростью работы самого транспорта
> в реальных сетевых условиях.

Понятно...

> [24] turbouser ©   (19.05.09 22:23)


> [25] DVM ©   (19.05.09 22:28)

Ганатия доставки в моем случае ЗЛО.
Потеря половины пакетов меньшее зло, чем задержка из-за потерянного пакета и в результате доставка устаревшего пакета.


 
DVM ©   (2009-05-19 22:36) [27]


> @!!ex ©   (19.05.09 22:33) [26]


> Ганатия доставки в моем случае ЗЛО.

Обмен информацией в сетевой игре это что ли?


 
тимохов ©   (2009-05-19 22:37) [28]

2Автор, тебе же сказали - любой компонент вносит сотые доли процента в общую скорость - все остальное сетевая передача.

wininet - это библиотека, используемая в IE.


 
@!!ex ©   (2009-05-19 22:40) [29]

> [27] DVM ©   (19.05.09 22:36)

Да. Собственно первая часть вопроса нужна была чтобы получить список доступных игровых серверов, который лежит на сервере в виде текстового файла.

Информация игровая обновляется 5 раз в секунду. Соответственно уходит 5 пакетов в секунду.
Если половина сдохнет, будет задержка в отображении. Что не есть страшно в моем случае.
Это от клиента к серверу.

В другую сторону(от сервера к клиенту) потеря страшнее, поэтому данные уходят и через пол секунды независимо от результата дублируются. Вероятность достваки в два раза выше, а дубль никакой роли не играет.


 
@!!ex ©   (2009-05-19 22:41) [30]

> [28] тимохов ©   (19.05.09 22:37)

а дайте ссылку на сайт _Rouse?


> [21] DVM ©   (19.05.09 22:02)
> На Winsock

А можно пример?


 
DVM ©   (2009-05-19 22:50) [31]


> @!!ex ©   (19.05.09 22:41) [30]


> А можно пример?

Примера у меня нет, может тебе почитать о сокетах для начала чего, чтоб понятнее стало. Вот например, Григорьева:

http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1021
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1060


 
@!!ex ©   (2009-05-19 23:36) [32]

> [31] DVM ©   (19.05.09 22:50)

Спасибо! Читаю! Очень интересно и понятно написанО!


 
тимохов ©   (2009-05-19 23:46) [33]

2Автор. Не страдай фигней и не делай своего клиента HTTP. Поверь, нормального ты не сделаешь. Ты знаешь сколько проксей может быть на твоем пути к серверу? Ты знаешь все методы авторизации? Ты знаешь, сколько методов передачи данных от сервера к тебе? Ты знаешь, чем отличается http 1.1. от 1.0? Ты читал спецификацию 2616 (http://www.ietf.org/rfc/rfc2616.txt - почитай и ужаснись сколько нужно сделать, чтобы сделать качественно клиента для Http)?

Поверь там очень много тонкостей. Есть сервера, которые отдают данные чанками (кусками), есть которые передают длину. И тебе придется это все изучать и реализовывать (если ты хочешь более менее универсальное средство).

Бери пример Розыча (то ли первый,то ли второй пример отсдедова http://rouse.drkb.ru/network.php#proxyload) и в путь. WinINet прекрасно знает все прокси и т.д. Я долго выбирал HTTP клиента. И ИНДИ смотрел, и ICS, и сам пытался писать. В итоге WinINet показал себя лучше всего.


 
DVM ©   (2009-05-19 23:52) [34]


> тимохов ©   (19.05.09 23:46) [33]


Это конечно все верно, но дело в том, что для работы с конкретным (а не абстрактным) сервером как правило не нужна полноценная реализация.


 
тимохов ©   (2009-05-20 00:02) [35]


> DVM ©   (19.05.09 23:52) [34]
> > тимохов ©   (19.05.09 23:46) [33]
> Это конечно все верно, но дело в том, что для работы с конкретным
> (а не абстрактным) сервером как правило не нужна полноценная
> реализация.


А хрен его, извините, знает, как нужно делать.

Мне фрилансер делал проект. Так мой апач отдавал данные с указанием content-length, а евоный апач (использовался при тестировании) отдавал чанками (кусками). Смотрел через wireshark (снифер такой). Опять же есть серьезные вопросы разрыва соединения при использовании прокси и авторизации.

Можно, конечно, самому писать. Но я так и не нашел внятного описания, как должны себя вести прокси.


 
@!!ex ©   (2009-05-20 00:04) [36]

> [33] тимохов ©   (19.05.09 23:46)

МНЕ НЕ НУЖЕН HTTP!
Первую часть вопроса я уже сделал через WinInit и не вижу причин переделывать, т.к. все работает.

Сейчас стоит вторая задача - связать два моих приложения через UDP.


 
тимохов ©   (2009-05-20 00:21) [37]

2Автор.
Извини, не дочитал твой пост :) Бывает.

Ну собсно ты сделал, как я тебе говорил - через wininet.
Про UDP, да Антона надо читать. Там хорошо написано.


 
antonn ©   (2009-05-20 01:10) [38]

Антонов много, всех не перечитаете %)


 
Дмитрий С ©   (2009-05-20 05:36) [39]

unit uHTTP;

interface
uses ActiveX, ComObj;

type
 IXMLHTTPRequest = interface(IDispatch)
   ["{ED8C108D-4349-11D2-91A4-00C04F7969E8}"]
   procedure open(const bstrMethod: WideString; const bstrUrl: WideString; varAsync: OleVariant;
                  bstrUser: OleVariant; bstrPassword: OleVariant); safecall;
   procedure setRequestHeader(const bstrHeader: WideString; const bstrValue: WideString); safecall;
   function getResponseHeader(const bstrHeader: WideString): WideString; safecall;
   function getAllResponseHeaders: WideString; safecall;
   procedure send(varBody: OleVariant); safecall;
   procedure abort; safecall;
   function Get_status: Integer; safecall;
   function Get_statusText: WideString; safecall;
   function Get_responseXML: IDispatch; safecall;
   function Get_responseText: WideString; safecall;
   function Get_responseBody: OleVariant; safecall;
   function Get_responseStream: OleVariant; safecall;
   function Get_readyState: Integer; safecall;
   procedure Set_onreadystatechange(const Param1: IDispatch); safecall;
   property status: Integer read Get_status;
   property statusText: WideString read Get_statusText;
   property responseXML: IDispatch read Get_responseXML;
   property responseText: WideString read Get_responseText;
   property responseBody: OleVariant read Get_responseBody;
   property responseStream: OleVariant read Get_responseStream;
   property readyState: Integer read Get_readyState;
   property onreadystatechange: IDispatch write Set_onreadystatechange;
 end;

 function CreateIXMLHTTPRequest:IXMLHTTPRequest;

implementation

 function CreateIXMLHTTPRequest:IXMLHTTPRequest;
 begin
   Result := CreateOleObject("Msxml2.XMLHTTP") as IXMLHTTPRequest;
 end;
end.


 
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.63 MB
Время: 0.01 c
15-1243110603
Юрий
2009-05-24 00:30
2009.07.26
С днем рождения ! 24 мая 2009 воскресенье


15-1243091123
NailMan
2009-05-23 19:05
2009.07.26
кто какие нетбуки пользует? Какие впечатления?


6-1205170549
Новичек
2008-03-10 20:35
2009.07.26
Обработка информации от нескольких сокетов.


15-1242986129
@!!ex
2009-05-22 13:55
2009.07.26
Преобразовать координаты точки из одной СК в другую


3-1224485366
Konrads
2008-10-20 10:49
2009.07.26
Использование FireBird на WWW





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский