Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.07.26;
Скачать: CL | DM;

Вниз

Програмно сделать 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;
Скачать: CL | DM;

Наверх




Память: 0.65 MB
Время: 0.017 c
15-1242737676
Игорь
2009-05-19 16:54
2009.07.26
Протестируйте программу пожалуйста


3-1224149989
tomkat
2008-10-16 13:39
2009.07.26
Не работает TIBDataSet в службе.


2-1243832097
sotrudnik1
2009-06-01 08:54
2009.07.26
отправить значение буквы в стороннее приложение


2-1243397495
Алексей Иванов
2009-05-27 08:11
2009.07.26
Свойство TTreeView.Parent


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