Как скачать файл через Proxy

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

— Сынок! Сколько раз тебе говорить, что я тебя родила, а не скачала из интернета!!!

DownloadFile(‘http://some.com/some.zip’, ‘c:\some.zip’);

function DownloadFile(const FileURL, FileName: String): Cardinal;

var

hSession, hFile: HInternet;

Buffer: array[1..1024] of Byte;

BufferLen, fSize: LongWord;

f: File;

begin

Result := 0;

hSession := InternetOpen(‘STEROID Download’,

INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);

if Assigned(hSession) then begin

hFile := InternetOpenURL(hSession, PChar(FileURL), nil, 0,

INTERNET_FLAG_RELOAD, 0);

if Assigned(hFile) then begin

AssignFile(f, FileName);

Rewrite(f,1);

fSize := 0;

repeat

InternetReadFile(hFile, @Buffer, SizeOf(Buffer), BufferLen);

BlockWrite(f, Buffer, BufferLen);

fSize := fSize BufferLen;

until (BufferLen = 0);

CloseFile(f);

Result := fSize;

InternetCloseHandle(hFile);

end;

InternetCloseHandle(hSession);

end;

end;

Комментарий:

function InternetOpen(lpszAgent: PChar;

dwAccessType: DWORD;

lpszProxy, lpszProxyBypass: PChar;

dwFlags: DWORD): HINTERNET; stdcall;

lpszAgent — строка символов, которая передается серверу и идентифицирует программное обеспечение, пославшее запрос.

dwAccessType

INTERNET_OPEN_TYPE_DIRECT : обрабатывает все имена хостов локально.

INTERNET_OPEN_TYPE_PRECONFIG : берет установки из реестра.

INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY — берет установки из реестра и предотвращает запуск Jscript или Internet Setup (INS) файлов.

! INTERNET_OPEN_TYPE_PROXY : использование прокси-сервера. В случае неудачи использует INTERNET_OPEN_TYPE_DIRECT.

LpszProxy — адрес прокси-сервера. Игнорируется только если параметр dwAccessType отличается от INTERNET_OPEN_TYPE_PROXY.

LpszProxyBypass — список имен или IP- адресов, соединяться с которыми нужно в обход прокси-сервера. В списке допускаются шаблоны. Так же, как и предыдущий параметр, не может содержать пустой строки. Если dwAccessType отличен от INTERNET_OPEN_TYPE_PROXY, то значения игнорируются, и параметр можно установить в nil.

DwFlags задает параметры, влияющие на поведение Internet- функций. Возможно применение комбинации из следующих разрешенных значений: INTERNET_FLAG_ASYNC, INTERNET_FLAG_FROM_CACHE, INTERNET_FLAG_OFFLINE.

{/codecitation}

Как сделать обмен файлами

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Сначала Катя искала мужа через Интернет, потом через Интерпол.

Посмотри спецификацию протокола на

http://slavanap2.sourceforge.net/nap.txt или

http://opennap.sourceforge.net/napster.txt

Также есть следующие исходники:

— SlavaNap (Delphi 4) http://slavanap2.sourceforge.net

— OpenNap (C, console app) http://opennap.sourceforge.net

— TekNap (C, console app) http://www.teknap.com

Возможно, что существуют другие исходники. Это можно выяснить в napigator форумах (http://forums.napigator.com)

Кроме того есть mailing list для разработчиков napster-совместимых программ:

http://www.onelist.com/community/napdev

Там также есть архив группы napdev.

Или пошли пустое письмо на napdev-subscribe@yahoogroups.com

{/codecitation}

Как переслать файл через nonBlocking сокет

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Благодаря американской компьютеризированной системе выборов президента, тысячи российских хакеров смогли принять участие в голосовании…

// а форме ServerSocket1, ClientSocket1 : (Active := False,

// Host := localhost, Port := 2001, xType := xNonBlocking),

// OpenDialog1, Button1, Memo1.

procedure TfmMain.FormCreate(Sender: TObject);

begin

ServerSocket1.Active:=true;

ClientSocket1.Active:=true;

end;

{— Server —}

procedure TfmMain.Button1Click(Sender: TObject);

var

sStream : TMemoryStream;

begin

sStream := TMemoryStream.Create;

if not OpenDialog1.Execute then

Exit;

sStream.LoadFromFile(OpenDialog1.FileName);

ServerSocket1.Socket.Connections[0].SendStreamThenDrop(sStream);

end;

{— Client —}

const

MAX_BUF_SIZE = $4095;

var

fStream: TFileStream;

{OnConnect}

procedure TfmMain.ClientSocket1Connect(Sender: TObject;

Socket: TCustomWinSocket);

begin

fStream:= TFileStream.Create(‘Receive.fil’, fmCreate);

end;

{OnRead}

procedure TfmMain.ClientSocket1Read(Sender: TObject;

Socket: TCustomWinSocket);

var

count :Integer;

buffer: Array [0..MAX_BUF_SIZE] of Char;

begin

repeat

Socket.Lock;

count:= Socket.ReceiveBuf(buffer,SizeOf(buffer));

if count > 0 then

fStream.WriteBuffer(buffer,count);

Socket.Unlock;

until (count <= 0);

Memo1.Lines.Add(IntToStr(fStream.Size));

end;

{OnDisconnect}

procedure TfmMain.ClientSocket1Disconnect(Sender: TObject;

Socket: TCustomWinSocket);

begin

fStream.Free;

end;

{/codecitation}

Как перед скачиванием узнать размер файла

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Приходит юзер к провайдерам и говорит.

— У Вас маршрут на Москву не работает.

— А откуда Вы знаете?…

GetUrlInfo(HTTP_QUERY_CONTENT_LENGTH, ‘http://some.com/some.zip’);

function GetUrlInfo(const dwInfoLevel: DWORD; const FileURL: string):

string;

var

hSession, hFile: hInternet;

dwBuffer: Pointer;

dwBufferLen, dwIndex: DWORD;

begin

Result := »;

hSession := InternetOpen(‘STEROID Download’,

INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);

if Assigned(hSession) then begin

hFile := InternetOpenURL(hSession, PChar(FileURL), nil, 0,

INTERNET_FLAG_RELOAD, 0);

dwIndex := 0;

dwBufferLen := 20;

if HttpQueryInfo(hFile, dwInfoLevel, @dwBuffer, dwBufferLen, dwIndex)

then Result := PChar(@dwBuffer);

if Assigned(hFile) then InternetCloseHandle(hFile);

InternetCloseHandle(hsession);

end;

end;

{/codecitation}

Закачать файл на WEB-сервер с помощью HTML

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Оригинал статьи: Delphi Web Development

На этой страничке вы узнаете как закачать файл на веб-сервер, используя HTML.

Перед тем как приступить к разработке, желательно ознакомиться с RFC1867: Form-based File Upload in HTML, в котором описаны форматы передачи файлов в HTML.

Клиент

Чтобы закачать файл на сервер, Вам нужно использовать тэг FORM. Для передачи данных формы, обязательно, используется метод POST и устанавливается MIME media type: multipart/form-data.

Вы должны установить в тэг FORM атрибут ENCTYPE равным multipart/form-data, и в форму добавить элемент INPUT типа file.

Например, давайте создадим следующий HTML файл, назовем его upload.htm и положим его в корневой директорий веб сервера.

DWD File Upload

CheckBox Test

RadioBox Test:

ON

OFF

TextBox Test:

File2 Test:

File2 Test:

File2 Test:

Пример 1

Итак, мы создали форму которая содержит элементы checkbox, radio, text и три(!) элемента file.

Загрузите этот файл браузером, например, набирите http://localhost/upload.htm. Если, нажав кноку Browse на форме, выбрать файл 1: C:\\image.gif, файл 2: C:\\test.exe, файл 3: C:\\text.txt и нажать кнопку Submit, в соответствии с RFC1867 браузер должен сформировать и передать в заголовке HTTP поле

ContentType: multipart/form-data; boundary=—7d015813802c4

и примерно следующий контент:

—-7d015813802c4

Content-Disposition: form-data; name=»checkbox»

ON

—-7d015813802c4

Content-Disposition: form-data; name=»radiobox»

ON

—-7d015813802c4

Content-Disposition: form-data; name=»text»

…текст из элемента текст…

—-7d015813802c4

Content-Disposition: form-data; name=»myfile1″; filename=»C:\\image.gif»

Content-Type: image/gif

…содержимое файла 1…

—-7d015813802c4

Content-Disposition: form-data; name=»myfile2″; filename=»C:\\test.exe»

Content-Type: application/octet-stream

…содержимое файла 2…

—-7d015813802c4

Content-Disposition: form-data; name=»myfile3″; filename=»C:\\text.txt»

Content-Type: text/plain

…содержимое файла 3…

—-7d015813802c4—

Пример 2

Где boundary (граница) — разделитель полей.

Сервер

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

Запускаем Delphi, создаем с помощью Delphi IDE новый проект (мы создали ISAPI DLL, вы можете создать как ISAPI, так и CGI) и создаем обработчик WebActionItem. Установим его свойство Default равным True.

Приступим к написанию кода. Создадим обработчик события OnAction, для созданного WebActionItem. Прежде всего нужно быть уверенным, что принимаемые данные действительно имеют ContentType: multipart/form-data:

procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;

Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);

begin

if (Pos(‘multipart/form-data’, LowerCase(Request.ContentType)) > 0) and

(Pos(‘boundary’, LowerCase(Request.ContentType)) > 0) then

begin

end

else

Response.Content := ‘Content-type is not «multipart/form-data».’;

end;

Пример 3

Определим boundary, для этого воспользуемся функцией ExtractHeaderFields:

var

Boundary: string;

Header: TStrings;

begin

Header := TStringList.Create;

try

ExtractHeaderFields([‘;’], [‘ ‘], PChar(Request.ContentType), Header,

False, False);

Boundary := Header.Values[‘boundary’];

finally

Header.Free;

end;

Пример 4

Для того, чтобы прочитать переданные клиентом данные, нужно прочитать свойство Content объекта Request. Следует сказать, что Request.Content не обязательно должен содержать все данные т.к. размер свойства Content ограничен, особенно актуально это для передачи файлов большого размера. Для того чтобы прочитать следующую порцию данных, используйте метод ReadClient объекта Request. Метод ReadClient читает данные в буфер. В качесте буфера используем PChar. Определить размер данных, которые необходимо считать можно так:

AllContent := Request.Content;

ByteToRead := Request.ContentLength — Length(AllContent);

Далее следует зарезервировать память для буфера, для того чтобы экономнее расходовать память, ограничим максимальный размер буфера константой MaxReadBlockSize. Определим весь поток данных, переданный клиентом:

const

MaxReadBlockSize = 8192;

var

Boundary, BufferStr, AllContent: string;

Header: TStrings;

ByteToRead, ReadedBytes, RSize: Integer;

Buffer: PChar;

begin

AllContent := Request.Content;

ByteToRead := Request.ContentLength — Length(AllContent);

try

while ByteToRead > 0 do

begin

RSize := MaxReadBlockSize;

if RSize > ByteToRead then

RSize := ByteToRead;

GetMem(Buffer, RSize);

try

ReadedBytes := Request.ReadClient(Buffer^, RSize);

SetString(BufferStr, Buffer, ReadedBytes);

AllContent := AllContent BufferStr;

finally

FreeMem(Buffer, RSize);

end;

ByteToRead := Request.ContentLength — Length(AllContent);

end;

// и возвратим клиенту справочную информацию

Response.Content := Response.Content Format(‘ContentType = %s

‘ContentLength = %d
Readed Bytes = %d
Boundary = %s


‘,

[Request.ContentType, Request.ContentLength, Length(AllContent),

boundary]);

except

on E: Exception do

Response.Content := Response.Content ‘

‘ E.Message;

end;

Пример 5

Итог: мы прочитали весь переданный контент и присвоили его переменной AllContent, а также узнали разделитель Boundary.

Следующим этапом необходимо полученный контент разобрать по частям. Для этого напишем функцию

ReadMultipartRequest(const Boundary: string;

ARequest: string; var AHeader: TStrings; var Data: string): string;

которая будет запрашивать разделитель Boundary и AllContent, и возвращать поля заголовка в AHeader и содержимое поля в Data. Результатом выполнения функции будет передан AllContent без первого поля формы. Например, после первой обработки данных, показанных в Примере 2, результат возвращаемый функцией будет:

—-7d015813802c4

Content-Disposition: form-data; name=»radiobox»

ON

—-7d015813802c4

Content-Disposition: form-data; name=»text»

…текст из элемента текст…

—-7d015813802c4

Content-Disposition: form-data; name=»myfile1″; filename=»C:\\image.gif»

Content-Type: image/gif

…содержимое файла 1…

—-7d015813802c4

Content-Disposition: form-data; name=»myfile2″; filename=»C:\\test.exe»

Content-Type: application/octet-stream

…содержимое файла 2…

—-7d015813802c4

Content-Disposition: form-data; name=»myfile3″; filename=»C:\\text.txt»

Content-Type: text/plain

…содержимое файла 3…

—-7d015813802c4—

Пример 6

объект AHeader будет содержать:

Content-Disposition=form-data; name=»checkbox»

а переменная Data = ‘ON’.

После четвертой обработки будет:

—-7d015813802c4

Content-Disposition: form-data; name=»myfile2″; filename=»C:\\test.exe»

Content-Type: application/octet-stream

…содержимое файла 2…

—-7d015813802c4

Content-Disposition: form-data; name=»myfile3″; filename=»C:\\text.txt»

Content-Type: text/plain

…содержимое файла 3…

—-7d015813802c4—

Пример 7

объект AHeader будет содержать:

Content-Disposition=form-data; name=»myfile1″; filename=»C:\\image.gif»

Content-Type=image/gif

а переменная Data = …содержимое файла 1….

Код функции приведен в Примере 8:

function TWebModule1.ReadMultipartRequest(const Boundary: string;

ARequest: string; var AHeader: TStrings; var Data: string): string;

var

Req, RHead: string;

i: Integer;

begin

Result := »;

AHeader.Clear;

Data := »;

if (Pos(Boundary, ARequest) < Pos (Boundary '--', ARequest))

and (Pos(Boundary, ARequest) = 1) then

begin

Delete(ARequest, 1, Length(Boundary) 2);

Req := Copy(ARequest, 1, Pos(Boundary, ARequest) — 3);

Delete(ARequest, 1, Length(Req) 2);

RHead := Copy(Req, 1, Pos(#13#10#13#10,Req)-1);

Delete(Req, 1, Length(RHead) 4);

AHeader.Text := RHead;

for i := 0 to AHeader.Count — 1 do

if Pos(‘:’, AHeader.Strings[i]) > 0 then

AHeader.Strings[i] := Trim(Copy(AHeader.Strings[i], 1,

Pos(‘:’, AHeader.Strings[i])-1)) ‘=’ Trim(Copy(AHeader.Strings[i],

Pos(‘:’, AHeader.Strings[i]) 1, Length(AHeader.Strings[i]) —

Pos(‘:’, AHeader.Strings[i])));

Data := Req;

Result := ARequest;

end

end;

Пример 8

Теперь осталось только вызвать данную процедуру в цикле и сохранить данные на диск.

Определим константу UploadPath, которая будет содержать путь к папке, в которую будем сохранять принятые файлы.

const

UploadPath = ‘C:\\temp\\upload\\’;

var

AllContent, Boundary, Data: string;

Header, HList: TStrings;

OutStream: TFileStream;

begin

if Request.ContentLength = Length(AllContent) then

while Length(AllContent) > Length(‘—‘ Boundary ‘—‘ #13#10)do

begin

Header := TStringList.Create;

HList := TStringList.Create;

try

AllContent := ReadMultipartRequest(‘—‘ Boundary, AllContent,

Header, Data);

ExtractHeaderFields([‘;’], [‘ ‘],

PChar(Header.Values[‘Content-Disposition’]), HList, False, True);

if (Header.Values[‘Content-Type’] ») and (Data ») then

begin

OutStream:=TFileStream.Create(UploadPath

ExtractFileName(HList.Values[‘filename’]), fmCreate);

try

try

OutStream.WriteBuffer(Pointer(Data)^, Length(Data));

Response.Content := Response.Content

Format(‘

File %s saved.’,

[ExtractFileName(HList.Values[‘filename’])]);

except

Response.Content := Response.Content

Format(‘

Unable to save file %s.’, [UploadPath

ExtractFileName(HList.Values[‘filename’])]);

end;

finally

OutStream.Free;

end

end

else

Response.Content := Response.Content Format(‘

Field %s = %s’,

[HList.Values[‘name’], Data]);

finally

Header.Free;

HList.Free;

end;

end;

Пример 9

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

{/codecitation}

Закачать файл из Интернета 3

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Оформил: DeeCo

Автор: http://www.swissdelphicenter.ch

{Forces a download of the requested file, object, or directory

listing from the origin server, not from the cache}

function DownloadURL_NOCache(const aUrl: string; var s: String): Boolean;

var

hSession: HINTERNET;

hService: HINTERNET;

lpBuffer: array[0..1024 1] of Char;

dwBytesRead: DWORD;

begin

Result := False;

s := »;

// hSession := InternetOpen( ‘MyApp’, INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);

hSession := InternetOpen(‘MyApp’, INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);

try

if Assigned(hSession) then

begin

hService := InternetOpenUrl(hSession, PChar(aUrl), nil, 0, INTERNET_FLAG_RELOAD, 0);

if Assigned(hService) then

try

while True do

begin

dwBytesRead := 1024;

InternetReadFile(hService, @lpBuffer, 1024, dwBytesRead);

if dwBytesRead = 0 then break;

lpBuffer[dwBytesRead] := #0;

s := s lpBuffer;

end;

Result := True;

finally

InternetCloseHandle(hService);

end;

end;

finally

InternetCloseHandle(hSession);

end;

end;

//aufrufen

var

s: String;

begin

if DownloadURL(‘http://www.swissdelphicenter.ch/’, s) then

ShowMessage(s);

end;

{/codecitation}

Закачать файл из Интернета 2

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Сколько пользуюсь интернетом — никак не могу понять: я вхожу в интернет или я выхожу в интернет?

uses

Wininet;

function DownloadURL(const aUrl: string): Boolean;

var

hSession: HINTERNET;

hService: HINTERNET;

lpBuffer: array[0..1024 1] of Char;

dwBytesRead: DWORD;

begin

Result := False;

// hSession := InternetOpen( ‘MyApp’, INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);

hSession := InternetOpen(‘MyApp’, INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);

try

if Assigned(hSession) then

begin

hService := InternetOpenUrl(hSession, PChar(aUrl), nil, 0, 0, 0);

if Assigned(hService) then

try

while True do

begin

dwBytesRead := 1024;

InternetReadFile(hService, @lpBuffer, 1024, dwBytesRead);

if dwBytesRead = 0 then break;

lpBuffer[dwBytesRead] := #0;

Form1.Memo1.Lines.Add(lpBuffer);

end;

Result := True;

finally

InternetCloseHandle(hService);

end;

end;

finally

InternetCloseHandle(hSession);

end;

end;

{/codecitation}

Закачать файл из Интернета

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Сколько пользуюсь интернетом — никак не могу понять: я вхожу в интернет или я выхожу в интернет?

uses

URLMon, ShellApi;

function DownloadFile(SourceFile, DestFile: string): Boolean;

begin

try

Result := UrlDownloadToFile(nil, PChar(SourceFile), PChar(DestFile), 0, nil) = 0;

except

Result := False;

end;

end;

procedure TForm1.Button1Click(Sender: TObject);

const

// URL Location

SourceFile = ‘http://www.google.com/intl/de/images/home_title.gif’;

// Where to save the file

DestFile = ‘c:\temp\google-image.gif’;

begin

if DownloadFile(SourceFile, DestFile) then

begin

ShowMessage(‘Download succesful!’);

// Show downloaded image in your browser

ShellExecute(Application.Handle, PChar(‘open’), PChar(DestFile),

PChar(»), nil, SW_NORMAL)

end

else

ShowMessage(‘Error while downloading ‘ SourceFile)

end;

// Minimum availability: Internet Explorer 3.0

// Minimum operating systems Windows NT 4.0, Windows 95

{********************************************************}

{2.}

uses

Wininet;

function DownloadURL(const aUrl: string): Boolean;

var

hSession: HINTERNET;

hService: HINTERNET;

lpBuffer: array[0..1024 1] of Char;

dwBytesRead: DWORD;

begin

Result := False;

// hSession := InternetOpen( ‘MyApp’, INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);

hSession := InternetOpen(‘MyApp’, INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);

try

if Assigned(hSession) then

begin

hService := InternetOpenUrl(hSession, PChar(aUrl), nil, 0, 0, 0);

if Assigned(hService) then

try

while True do

begin

dwBytesRead := 1024;

InternetReadFile(hService, @lpBuffer, 1024, dwBytesRead);

if dwBytesRead = 0 then break;

lpBuffer[dwBytesRead] := #0;

Form1.Memo1.Lines.Add(lpBuffer);

end;

Result := True;

finally

InternetCloseHandle(hService);

end;

end;

finally

InternetCloseHandle(hSession);

end;

end;

{/codecitation}

Докачка файлов по сети (NetBios)

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Автор: http://forum.vingrad.ru

Мне вот все интересно было…думал проги, которые файлы по сети докачивают как-то хитро с нетбиосом работают…И вот решил попробовать написать нечто подобное…Токо похоже все они ( проги ) про нетбиос и слыхом не слыхивали…нашел простейшее решение этой проблемы… Код некрасивый, потому как писал чисто для проверки…более того, тут надо переписать его весь, но общий смысл должен быть понятен…я разочарован :((

procedure TForm1.Button1Click(Sender: TObject);

var

Stream,

Stream1: TFileStream;

Temp: array[0..$FFFF] of Byte;

Access: Integer;

FileNames, Filenames1: string;

begin

with TOpenDialog.Create(Form1) do

begin

Execute;

FileNames := FileName;

Free;

end;

if Filenames = » then

Exit;

with TSaveDialog.Create(Form1) do

begin

Execute;

FileNames1 := FileName;

Free;

end;

if Filenames1 = » then

Exit;

Access := fmOpenReadWrite;

ZeroMemory(@Temp, sizeof(Temp));

Stream := TFileStream.Create(FileNames, fmOpenRead);

if not FileExists(Filenames1) then

Access := fmCreate;

Stream1 := TFileStream.Create(Filenames1, Access);

Gauge1.MaxValue := Stream.Size;

Stream.Position := Stream1.Size;

Stream1.Position := Stream1.Size;

Label1.Caption := IntToStr(Stream1.Position);

Label2.Caption := IntToStr(Stream.Size);

Gauge1.Progress := Stream.Position;

while Stream.Size Stream1.Size do

begin

if (Stream.Size — Stream1.Position) < sizeof(Temp) then

begin

Stream1.CopyFrom(Stream, Stream.Size — Stream1.Position);

end

else

Stream1.CopyFrom(Stream, sizeof(Temp));

Gauge1.Progress := Stream.Position;

Label1.Caption := IntToStr(Stream.Position);

Label2.Caption := IntToStr(Stream.Size);

Form1.Update;

Application.ProcessMessages;

end;

Stream.Free;

Stream1.Free;

end;

{/codecitation}

Что такое сокет

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Мама приходит из аптеки и говорит дочке, которая сидит в чате:

— Я марганцовку купила.

— Рулез! — отвечает дочка не отрываясь от компа.

Мама через 5 минут раздумия:

— Нет не рулез, а марганцовку!

Существует мировой стандарт структуры протоколов связи — семиуровневая OSI (Open Systems Interface — интерфейс открытых систем). Hа каждом из уровней этой структуры решается свой объем задач своими методами. Сокеты находятся на так назывемом транспортном уровне — ниже находится сетевой протокол IP, выше — специализированные протоколы сеансового уровня, ориентированные на решение конкретных задач — это всем известные FTP, SMTP, etc.

Если смотреть по сути, сокет — это модель одного конца сетевого соединения, со всеми присущими ему свойствами, и, естественно — возможностью получать и передавать данные. По содержанию — это прикладной программный интерфейс, входящий в состав многих ОС. В семействе Windows — начиная с версии 3.11, и носит название WinSock. Прототипы функций WinSock API находятся в файле winsock.pas. В Delphi есть полноценная инкапсуляция клиентского и серверного сокетов, представленная компонентами TClientSocket и TServerSocket, находящимися на закладке Internet.

Сокеты не обязательно базируются на протоколе TCP/IP, они могут также базироваться на IPX/SPX, etc.

Также Вам следует ознакомиться со списком зарезервированных номеров портов.

Механизм взаимодействия сокетов таков. С одной из двух сторон запускается серверный сокет, который сразу после запуска находится в режиме прослушивания (listening), точнее — ожидания запросов от клиентов. После получения запроса от клиента устанавливается связь, и создается новый экземпляр серверного сокета.

Так как работа с сокетами, это, по сути — операции ввода/вывода, которые бывают синхронными или асинхронными, то и тип работы сокета обладает бывает синхронным или асинхронным. Компоненты TClientSock и TServerSock поддерживают оба режима работы.

Дополнение от Анатолия Подгорецкого:

Когда говорят СОКЕТ то часто не представляют, что это такое. Можно говорить об моделях, об реализациях и так далее. о есть одно простое толкование, применимое для протокола IP. Как известно для взаимодействия между машинами по протоколу IP используются адреса и порты.

Первое на текущий момент представляют из себя 32-x битный адрес, наиболее часто его представляют в символьной форме mmm.nnn.ppp.qqq (адрес разбитый на четыре октета по одному байту в октете и разделеный точками) .

Второе — это номер порта в диапазоне от нуля до 65535

Так вот эта пара и есть сокет (гнездо в в котором расположены адрес и порт).

В процессе обмена как правило используются два сокета — сокет отправителя и сокет получателя.

апример при обращении к моему серверу на HTTP порт сокет будет выглядеть так: 194.106.118.30:80, а ответ будет поступать на mmm.nnn.ppp.qqq:xxx

{/codecitation}