faqs.org.ru

 Главная > Программирование > Языки Pascal/Delphi >

RU.DELPHI.INTERNET FAQ

Секция 1 из 2 - Предыдущая - Следующая

From: FAQ Poster (Den Krep) <FAQ.Poster.(Den.Krep)@p25.f482.n463.z2.fidonet.org>
Date: Mon, 28 Oct 2002 00:29:03 +0300
Subj: Fido7.Ru.Delphi.internet FAQ

++++++++++++++++++
 Start Of Content
 Date: 12.10.2002
++++++++++++++++++
I-1   Ru.Delphi.Internet FAQ
I-2   Copyrights:
I-3   Преамбула
I-4   О поле Subject
I-5   Что  Е рекомендуется:
I-6   Изменения и дополнения к документу. Распространение документа.
I-7   Рекомендуемые источники информации.
Q-8   Что мне нужно, чтобы писать приложения для Internet или
      использующие Internet для передачи данных?
Q-9   Хочу сделать WEB-Browser. Что делать?
Q-10  Я хочу работать с протоколами HTTP, FTP...
Q-11  Я хочу отправлять из моего приложения электронную почту по
      протоколам SMTP, POP3...
Q-12  Мне надо реализовать обмен данными между двумя удаленными машинами
      (переслать файл).
Q-13  Как мне сделать обмен данными (файлами), как в Napster'е?
Q-14  А что такое сокет?
Q-15  Нужно сканировать порты через сокс-прокси сервер. Как это сделать?
Q-16  У меня ни TServerSocket, ни TClientSocket без scktsrvr.exe
      отказываются работать.
Q-17  Как пеpесылать файл чеpез nonBlocking socket?
Q-18  Хочу получать информацию о дате и времени из Internet.
Q-19  При запросе по неверному адресу компонент TNMHTTP виснет или
      вылетает. Что делать?
Q-20  Мне надо закодировать данные в UUE (MIME) код.
Q-21  Компоненты на странице FastNet глючат!
Q-22  Хочу организовать чат. Как?
Q-23  Ассинхронная ошибка.
Q-24  Я слышал, что Delphi позволяет писать CGI-приложения. Так ли это?
Q-25  Как мне отлаживать CGI-приложение?
Q-26  Мое CGI-приложение при обращении к нему ничего не возвращает. Что
      делать?
Q-27  Бардак с кириллицей в параметрах CGI запроса
Q-28  Как отправить письмо, с помощью клиента по умолчанию?
Q-29  Как открыть страничку с помощью браузера по умолчанию?
Q-30  Как отправить письмо я знаю, а как указать тему, текст сообщения?
Q-31  Как узнать IP машины по имени?
Q-32  Как из ActiveX запросить другую страницу в браузере?
Q-33  Какая реализация у ICQ и других Internet-пейджеров?
Q-34  Как у TWebBrowser отключить контекстное меню от правой кнопки
      мыши?
Q-35  Как узнать домен, к которому я в данный момент подключен?
      Используется WinNT.
Q-36  Как из своей программы вызвать диалог изменения настроек Internet?
Q-37  Как определить наличие соединения c Internet?
Q-38  Могут ли передаваться данные из html-страницы в программу (через
      TWebBrowser)?
Q-39  Почему при использовании метода TWebBrowser.Navigate нужно
      указывать полное имя файла?
Q-40  Как хранить web-страницы внутри файла?
Q-41  Как определить свой IP адрес?
Q-42  Как с помощью Indy работать с Socks Proxy?
Q-43  Ищу исходники WEB-сервера на Object Pascal
Q-44  Как в TWebBrowser организовать изменение размера шрифта?
Q-45  Как перед активацией сокета определить, занят ли на данной машине
      нужный порт?
Q-46  Как скачать файл, используя proxy?
Q-47  Как перед скачиванием узнать размер файла?
Q-48  Можно ли как-нибудь обеспечить стабильную работу на машинах со
      старыми версиями WinInet?
++++++++++++++++++

------------------------------------------------------------
I-1:  Ru.Delphi.Internet FAQ
------------------------------------------------------------


------------------------------------------------------------
I-2:  Copyrights:
------------------------------------------------------------
Текущим ведущим FAQ является Den Krep (c)
За основу взят FAQ RU.DELPHI.INTERNET (c) Vlad Kiselev, 2001-2002
частично (c) Alexey Mahotkin, 1997..2000
(c) авторы ответов на вопросы:

Vlad Kiselev, 2:5030/1095.6
Andrei Pangin, pan@sbor.ru
Marat Shamsiev, 2:5093/14.2
Anatoly Podgoretsky, anatoly@podgoretsky.com
Vjacheslav Trushkin, trushkin@europe.com
Stas Malinovski, stasm@tsl.ru
Kazantsev Alexey, kazav@vngdu.udmurtneft.ru
Andrey Belyakov, andrejb@netmail.lv
Andrew V. Fionik, fionika@papillon.ru
Tolik Tentser, tt@katren.ru
Roman Timofeew, roman@kavkaz.elektra.ru
Dennis Prochko, sysadmin@farmeko.khv.ru
Алексей, lexx@basegroup.ru
Vladimir Hmelyoff, 2:5055/115.61
Sergey Grebenyuk, 2:468/57.333
Philip A. Milovanov, milovanov@diagnostic.ru
Oleg Chensky, chensky@grot.de
Vladimir Vassiliev, voldemar@mkb.mari.ru
Gavrilo, gavrilo@dnepro.kharkov.ua
Stepan F.Mitish, step@abaddon.ntu-kpi.kiev.ua
Alexey Goloborchy, golalex@bicom.ru
Alexander V. Gaiduk, gav@lesobank.ru
Yury Sinegubov, 2:5006/1
Andrei N. DUBIK, sland@e-mail.pl.ua

------------------------------------------------------------
I-3:  Преамбула
------------------------------------------------------------
Пожалуйста, воздержитесь от задавания вопросов в конференции
RU.DELPHI.INTERNET, до того, как прочтете этот документ, правила
конференции, ознакомитесь со списком рекомендованной литературы
и проведете самостоятельные исследования вопроса. Это поможет
всем нам сохранить на должном высоком уровне соотношение полезной
и бесполезной информации и разгрузить конференции от бесполезного трафика.


------------------------------------------------------------
I-4:  О поле Subject
------------------------------------------------------------
Правилами иерархии, в частности, регламентируется содержание
поля Subject ваших писем. Дело в том, что довольно большое
количество "потенциально полезных вам индивидумов" читают эхи
методом "по сабджектам", сознательно не тратя время на письма
под заголовком "Help!", "Проблема" или "Вопрос чайника". В данном
случае использование комбинации клавиш Shift-1 лишь усугубляет
ваше положение. Подумайте об этом.

 е указание же заголовка вообще может вызвать законный вопрос
"ТЫ МЕ Я УВАЖАЕШЬ", так здесь явное неуважение к читателям
конференции, не хватило даже сил на написание заголовка, то
какое право на получение ответа, лень написать заголовок, так
остальным будет лень отвечать.


------------------------------------------------------------
I-5:  Что  Е рекомендуется:
------------------------------------------------------------
* обсуждение вопросов, относящихся к базам данных - существует
конференция RU.DELPHI.DB.

* обсуждение вопросов, относящихся к отчетам - существует
конференция RU.DELPHI.REPORTS.

* обсуждение общих программирования на Delphi - существует
родоначальная конференция RU.DELPHI.

* обсуждение вопросов вида "А что такое Delphi?", "Что такое
Интернет?".Существуют конференции RU.DELPHI.CHAINIK и
RU.INTERNET.CHAINIK.

! К сожалению, мотивация типа "мой аплинк/провайдер не получает
эту эху/ньюсгруппу" в данном случае не принимается, потому что
за продолжительное время, прошедшее с момента создания этих
конференций, следовало бы подумать в первую очередь о себе и
создать для себя необходимое количество каналов поступления
информации.

* обсуждение Вашей совершенно новой и безумно свежей идеи о
том, что эху пора разделить на две/три/больше частей, потому что
читать ее нет никаких сил. Вы даже не в первой сотне придумавших
и успешно высказавших сие. От себя могу посоветовать пользоваться
хорошими программами для чтения эхо-конференций.

* обсуждение тем, не связанных с програмированием на Delphi:
алгоритмы, общие вопросы программирования под Win32, общие
организационные вопросы, связанные с разработкой программного
обеспечения, etc.

* общая неспособность получать информацию из окружающей
реальности также не приветствуется. Прочтите книгу об эффективной
коммуникации и должном отношении ко всему.


------------------------------------------------------------
I-6:  Изменения и дополнения к документу. Распространение документа.
------------------------------------------------------------
Этот документ регулярно изменяется в результате отслеживания
происходящего в  RU.DELPHI.INTERNET. Вы можете поучаствовать
в составлении документа, прислав по адресу 2:463/482.25 - Den Krep
<daywer@alfacom.net>) сформулированный вариант вопроса, ответ или
дополнение или исправление к ответу. Довольно важным критерием
отбора ответов является размер. Я не хочу публиковать большие куски
кода, предпочитая давать указание на источник дополнительной
информации или направление самостоятельных разработок. В любом
случае, Вы можете обратиться к авторам сопутствующих проектов,
список которых приведен ниже.

Все здравомыслящие люди ошибаются - не ошибаются только
дураки. Ведущий данного FAQ и уважаемые авторы ответов на
вопросы тоже не безгрешны и могут ошибиться. Поэтому, любые
исправления/дополнения/примечания к данному документу будут
с радостью приняты по вышеозначенным адресам. Не следует
шумно обсуждать огрехи авторов в конференции - не суди да и
не осудим будешь.

Данный документ доступен в конференции RU.DELPHI.INTERNET
(регулярная отправка раз в неделю по воскресеньям). В
Интернете организован центральный репозиторий для всех FAQ
из иерархии fido7.ru.delphi.*, находится по адресу
http://www.podgoretsky.com или http://nps.vnet.ee (доступны
исходные тексты движка, движок FaqMaker.exe и последнии
версии баз). Альтернативный репозиторий, но имеющий более
широкое назначение (не только иерархии fido7.ru.delphi.*)
расположен по адресу http://faq.delphiplus.org, хотя там и
более быстрый хостинг, но информация может быть менее
актуальной.

Также последняя версия FAQ доступна по следующим адресам:
http:/daywer.by.ru/fido/ru_delphi_internet_faq.zip
и
http://daywer.by.ru/fido/ru_delphi_internet_faq_txt.zip

Разрешается свободное распространение и использование этого
документа при соблюдении определенной вежливости по отношению
к автору и читателям, основной составляющей чего является
соблюдение целостности документа. Не очень приветствуется
выкладывание копий этого документа на WWW: подумайте,
нужны ли вам непрерывные усилия по синхронизации?

Если же вы вынуждены использовать этот документ на сайте,
для того, чтобы создать его  содержимое, подумайте, нужен
ли вообще ваш сайт?

Остерегайтесь подделок.


------------------------------------------------------------
I-7:  Рекомендуемые источники информации.
------------------------------------------------------------
Прежде всего, конечно же, книги. Как бы это странно ни
звучало, но зайдите в книжный магазин и купите себе там
какую-нибудь книгу, даже если она уже у Вас есть. Следует
сразу предупредить, что специфика современного российского
книгоиздания такова, что существует довольно большое
количество книг, не стоящих своих денег. Вероятно, Вам
следует положиться на собственное чутье и тщательно изучить
предлагаемую продукцию.

Список литературы на все интересующие темы, рекомендованный
к прочтению, находится в неофициальном FAQ эхоконференции
RU.BOOKS.COMPUTING. Свежие версии этого FAQ регулярно
публикуются в соответствующей эхоконференции.

Учтите, что кроме книг по Delphi вас могут интересовать
также издания, посвященные программированию под Windows
и проектированию баз данных. Delphi, в сущности, является
обычным компилятором для Windows, и довольно большое
количество вопросов, которые у вас возникнут, будут не столь
уж сильно ориентированы именно на Delphi. В свете тематики
данного FAQ Вас также должны заинтересовать книги,
посвященные функционированию сети Internet и программированию
для этой сети.

Само собой, хотелось бы увидеть у активного участника
конференции определенные знания языка программирования
Object Pascal, являющегося основой Delphi, а также знаний
в области программирования вообще, программирования
под Windows в частности, а также предметной области своей
собственной задачи. Без всякого сомнения, вы можете общаться
и задавать вопросы на любом уровне, но ожидайте
соответствующей реакции извне.

Научитесь также пользоваться системой помощи, поставляемой
вместе с Delphi. Как это ни прискорбно, весьма ощутимый
процент задаваемых в эхе вопросов легко снимается
нажатием кнопки F1 и поиском примерного перевода
вопроса на английский язык. Примером тому может являться
сакраментальный вопрос о получении короткого имени файла
из длинного и ответ: GetShortPathName. Да, скорее всего вам
придется восполнить свои пробелы в школьном образовании
и изучить некоторое подмножество английского языка, без коего
вы имеете не столь много шансов успешно функционировать в
выбранной области.

Учтите наличие в поставке Delphi большого количества
разнообразных примеров. Возможно, ознакомившись с ними,
вы приобретете дополнительные знания. Изучите исходные
тексты Visual Component Library, поставляемой вместе с
Delphi Professional и Delphi Client/Server, а также хорошие
образцы кодирования и проектирования, например, исходники
rxLib.

Возможно, вам следует приобрести тем или иным способом
ту часть Microsoft Developer Network (MSDN), что содержит
в себе документацию. Это диски с названиями "Platform SDK",
"Additional SDKs and Tools" и "DDKs". В них содержится более
свежая, более полная и обширная информация по всем
аспектам программирования под Windows. Подписка на
эту часть MSDN (это первый уровень) стоит не столь
дорого и вы имеете все шансы купить ее, например, для
своей организации. Более того, на http://msdn.microsoft.com
можно получить доступ к львиной доле документации из MSDN.

Множество качественной информации, относящейся к
программированию под Windows 95/NT, можно получить
на http://www.sysinternals.com. На http://www.iarchitect.com
находится большой ресурс, посвященный вопросам построения
пользовательского интерфейса. На сайте http://www.perl.org.ru
содержится информация, посвященная CGI-программированию,
а на сайте http://www.webclub.ru можно найти массу полезной
информации о сети Internet.

Документы RFCxxxx можно найти на сайте Internet Engineering Task Force
http://www.ietf.org/. Либо на страничке rfc-editor'а http://www.rfc-editor.org


По возможности фидошные обитатели RU.DELPHI помещают
интересные файлы в так называемые файлэхи. Официальной
файлэхой RU.DELPHI является WDEVDELPHI. Ценным ресурсом
являются файлэхи группы FED* (модератор -- Акжан Абдулин,
2:5040/55). Если вы читаете RU.DELPHI из Фидо, то подпишитесь
на эти файлэхи и научитесь пользоваться файловыми запросами
(FReq'ами), так как многие узлы хранят файлы, проходившие
по файлэхам, в течение довольно долгого времени.
Обратитесь к вашему боссу в случае затруднений. Если
же Вы из Интернета, то поисковые машины, такие как
http://www.altavista.com, http://ftpsearch.lycos.com, а также
крупнейший архив ньюсгрупп http://www.dejanews.com,
станут вашими лучшими помощниками. Вам следует
также заметить, что существует определенное количество
FTP-архивов, содержащих вышеупомянутые файлэхи,
например, ftp://bbs.ogo.ru.

Само собой, Интернет переполнен ресурсами, посвященными
Borland Delphi. Для начала хороший список ссылок можно
найти на официальной странице rxLib: http://www.rxlib.com.

Очень полезным ресурсом является Delphi Bug List, лежащий
по адресу http://www.dataweb.net/~r.p.sterkenburg. Это
список ошибок во всех известных версиях Delphi, адекватно
обновляемый.

В FIDO вы можете подписаться на дружественные эхи, такие как:

     RU.CBUILDER - Borland C++Builder;
     RU.CGI;
     RU.INTERNET.SOFT - программное обеспечение для Internet;
     RU.INTERNET.TECHNOLOGY;
     SU.WINDOWS.PROG - общие вопросы программирования под MS Windows;
     SU.WIN32.PROG - вопросы программирования для Win32 API;
     SU.WIN95.PROG - вопросы программирования под MS Windows 95;
     SU.DBMS - базы данных;
     SU.DBMS.SQL - SQL-базы данных;
     SU.DBMS.BORLAND - базы данных фирмы Borland;
     SU.DBMS.INTERBASE - "родная" для Delphi база данных;
     SU.SOFTW - общие вопросы разработки программ;
     RU.ALGORITHMS - вещи, не зависящие от фамилии президента IBM и
текущего номера сервиспака к NT;
     SU.FLAME - обсуждение превосходства Borland Delphi над всеми
прочими средствами разработки.


------------------------------------------------------------
Q-8:  Что мне нужно, чтобы писать приложения для Internet или использующие
Internet для передачи данных?
------------------------------------------------------------
Прежде всего, Вам нужно иметь хотя бы небольшое представление о самой Internet.

Также, Вам нужна Delphi Enterprise, которая содержит все необходимые компоненты
и исходники.

Также, для отладки приложений, Вам может понадобится
установить на своем компьютере Internet-сервер. Наиболее
популярный сервер для *NIX - Apache, имеется также и в
реализации для Windows. Я использую Xitami Server, который
можно бесплатно загрузить на http://www.imatrix.com.


------------------------------------------------------------
Q-9:  Хочу сделать WEB-Browser. Что делать?
------------------------------------------------------------
Существует Active-X компонент TWebBrowser - это тот же самый, что используется
в MS IE.

Компонент из Netscape Navigator также можно поместить на форму, подробности на
http://www.chami.com/tips/delphi/103096D.html

Еще на http://www.pbear.com лежат THTMLViewer и TFrameViewer.


------------------------------------------------------------
Q-10:  Я хочу работать с протоколами HTTP, FTP...
------------------------------------------------------------
Для этих целей предназначены компоненты TNMFTP, TNMHTTP.

См. также Q46, Q47

DK: Можно также посмотреть в сторону компонент TServerSocket, TClientSocket
и документов RFC2616 (HTTP1.1), RFC1945 (HTTP1.0), RFC765 (FTP)

------------------------------------------------------------
Q-11:  Я хочу отправлять из моего приложения электронную почту по протоколам
SMTP, POP3...
------------------------------------------------------------
В D5 Вы можете попробовать использовать компоненты TNMSMTP и TNMPOP3,
в D6 и Kylix компоненты от NetMasters заменены компонентами Indy.

Алгоритм простой (для сторонних компонентов он принципиально ничем не
отличается):
- необходимо заполнить структуру PostMessage;
- отправить эту структуру при помощи метода SendMail.

Структура PostMessage:
(*) FromName: string - имя отправителя;
FromAddress: string - Почтовый адресс отправителя
ReplyToAddress: string - Адрес, по которому следует ответить на письмо;
Organization: string
LocalProgram: string - Имя почтовой программы отправителя;
(*) ToAddress: TStringList - Почтовый адрес главного получателя (ей)
ToCC: TStringList - Список получателей Carbon Copy
ToBCC: TSringList - Список получателей Blind Carbon Copy
Attachments: TStringList - Список вложений
Body: TStringList - Собственно текст письма
Subject: string - Строка темы письма.
(*) - помечены обязательные поля
С остальным не сложно разобраться самому.

-----------------------------------

Также это можно сделать при помощи MAPI.
Т.е. письмо будет отправлено средствами _почтовой_программы_по_умолчанию_ - со
всеми недостатками :) (например письмо будет помещено в папку "отправленные").
Зато без всяких там компонент и просто :)

Ниже готовая функция, в которой:
From - от кого
Dest - кому
Subject - тема
Text - текст письма
FileName - путь к вложению (если '', то соответственно ничего и не вкладываем)
Outlook - показывать или нет письмо перед отправкой (в твоём случае False)

Uses MAPI;
....
function SendMail(const From, Dest, Subject, Text, FileName: PChar;
Outlook: boolean):Integer;
var
  Message: TMapiMessage;
  Recipient, Sender: TMapiRecipDesc;
  File_Attachment: TMapiFileDesc;

  function MakeMessage: TMapiMessage;
  begin
    FillChar(Sender, SizeOf(Sender), 0);
    Sender.ulRecipClass := MAPI_ORIG;
    Sender.lpszAddress := From;

    FillChar(Recipient, SizeOf(Recipient), 0);
    Recipient.ulRecipClass := MAPI_TO;
    Recipient.lpszAddress := Dest;

    FillChar(File_Attachment, SizeOf(File_Attachment), 0);
    File_Attachment.nPosition := Cardinal(-1);
    File_Attachment.lpszPathName := FileName;

    FillChar(Result, SizeOf(Result), 0);
    with Message do begin
      lpszSubject := Subject;
      lpszNoteText := Text;
      lpOriginator := @Sender;
      nRecipCount := 1;
      lpRecips := @Recipient;
      nFileCount := 1;
      lpFiles := @File_Attachment;
    end;
  end;

var
  SM: TFNMapiSendMail;
  MAPIModule: HModule;
  MAPI_FLAG: Cardinal;
begin
  if Outlook then
   MAPI_FLAG:=MAPI_DIALOG
  else
   MAPI_FLAG:=0;
  MAPIModule := LoadLibrary(PChar(MAPIDLL));
  if MAPIModule = 0 then
    Result := -1
  else
    try
      @SM := GetProcAddress(MAPIModule, 'MAPISendMail');
      if @SM <> nil then begin
        MakeMessage;
        Result := SM(0, Application.Handle, Message, MAPI_FLAG, 0);
      end else Result := 1;
    finally
      FreeLibrary(MAPIModule);
    end;
end;

------------------------------------------------------------
Q-12:  Мне надо реализовать обмен данными между двумя удаленными машинами
(переслать файл).
------------------------------------------------------------
Удобнее всего будет сделать это при помощи сокетов.

В Delphi есть компоненты TClientSocket и TServerSocket, реализующие,
соответственно, клиентский и серверный сокеты. Также, Вы можете использовать
функции API WinSock напрямую - их заголовки находятся в файле winsock.pas.
Однако, на мой взгляд, использование компонентов намного удобнее.

Также можно использовать входящие в поставку Delphi Enterprise компоненты
фирмы NetMasters - это TNMMsgServ и TNMMsg (серверная и клиентская части;
компоненты предназначены для обмена текстовыми сообщениями), TNMStrmServ и
TNMStrm (серверная и клиентская части; компоненты предназначены для обмена
потоками данных), а также TNMUDP, компонент, реализующий протокол UDP (User
Datagrem Protocol, см. также RFC768).


------------------------------------------------------------
Q-13:  Как мне сделать обмен данными (файлами), как в Napster'е?
------------------------------------------------------------
Посмотри спецификацию протокола на
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

------------------------------------------------------------
Q-14:  А что такое сокет?
------------------------------------------------------------
Существует мировой стандарт структуры протоколов связи -
семиуровневая OSI (Open Systems Interface - интерфейс
открытых систем). На каждом из уровней этой структуры
решается свой объем задач своими методами. Сокеты
находятся на так назывемом транспортном уровне - ниже
находится сетевой протокол 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


------------------------------------------------------------
Q-15:  Нужно сканировать порты через сокс-прокси сервер. Как это сделать?
------------------------------------------------------------
Описание протокола SOCKS5 см. в RFC1928: http://www.faqs.org/rfcs/rfc1928.html

Хотя проще запустить уже готовый сканер портов из-под SocksCap или e-Border
Client (www.socks.nec.com)


------------------------------------------------------------
Q-16:  У меня ни TServerSocket, ни TClientSocket без scktsrvr.exe отказываются
работать.
------------------------------------------------------------
Вопрос: У меня ни TServerSocket, ни TClientSocket без scktsrvr.exe отказываются
работать! Слышал, что для решения проблемы можно что-то откуда-то вырезать и
вклеить в программу.

Установите этот компонент:

*--* sck.pas *--*
unit Sck;

interface

uses
  Classes, SysUtils, Windows, Messages,
  ScktComp, SConnect, ActiveX, MidConst;

type
  TNotifyClient = procedure (Sender: TObject; Thread: TServerClientThread) of
object;

{ TSocketDispatcher }
  TSocketDispatcher = class;

{ TSocketDispatcherThread }
  TSocketDispatcherThread = class(TServerClientThread, ISendDataBlock)
  private
    FRefCount: Integer;
    FInterpreter: TDataBlockInterpreter;
    FTransport: ITransport;
    FInterceptGUID: string;
    FLastActivity: TDateTime;
    FTimeout: TDateTime;
    FRegisteredOnly: Boolean;
  protected
    SocketDispatcher: TSocketDispatcher;
    function CreateServerTransport: ITransport; virtual;
    procedure AddClient;
    procedure RemoveClient;
    { IUnknown }
    function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
    function _AddRef: Integer; stdcall;
    function _Release: Integer; stdcall;
    { ISendDataBlock }
    function Send(const Data: IDataBlock; WaitForResult: Boolean): IDataBlock;
stdcall;
  public
    constructor Create(AOwner: TSocketDispatcher; CreateSuspended: Boolean;
      ASocket: TServerClientWinSocket; const InterceptGUID: string;
      Timeout: Integer; RegisteredOnly: Boolean);
    procedure ClientExecute; override;
    property LastActivity: TDateTime read FLastActivity;
  end;

{ TSocketDispatcher }
  TSocketDispatcher = class(TServerSocket)
  private
    FInterceptGUID: string;
    FTimeout: Integer;
    FRegisteredOnly: Boolean;
    FOnRemoveClient: TNotifyClient;
    FOnAddClient: TNotifyClient;
    procedure GetThread(Sender: TObject; ClientSocket: TServerClientWinSocket;
      var SocketThread: TServerClientThread);
  published
    constructor Create(AOwner: TComponent); override;
    property InterceptGUID: string read FInterceptGUID write FInterceptGUID;
    property Timeout: Integer read FTimeout write FTimeout;
    property RegisteredOnly: Boolean read FRegisteredOnly write
FRegisteredOnly;
    property OnAddClient: TNotifyClient read FOnAddClient write FOnAddClient;
    property OnRemoveClient: TNotifyClient read FOnRemoveClient write
FOnRemoveClient;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Midas', [TSocketDispatcher]);
end;

{ TSocketDispatcherThread }

constructor TSocketDispatcherThread.Create(AOwner: TSocketDispatcher;
  CreateSuspended: Boolean; ASocket: TServerClientWinSocket;
  const InterceptGUID: string; Timeout: Integer; RegisteredOnly: Boolean);
begin
  SocketDispatcher := AOwner;
  FInterceptGUID := InterceptGUID;
  FTimeout := EncodeTime(Timeout div 60, Timeout mod 60, 0, 0);
  FLastActivity := Now;
  FRegisteredOnly := RegisteredOnly;
  inherited Create(CreateSuspended, ASocket);
end;

function TSocketDispatcherThread.CreateServerTransport: ITransport;
var
  SocketTransport: TSocketTransport;
begin
  SocketTransport := TSocketTransport.Create;
  SocketTransport.Socket := ClientSocket;
  SocketTransport.InterceptGUID := FInterceptGUID;
  Result := SocketTransport as ITransport;
end;

procedure TSocketDispatcherThread.AddClient;
begin
  with SocketDispatcher do
    if Assigned(OnAddClient) then OnAddClient(SocketDispatcher, Self);
end;

procedure TSocketDispatcherThread.RemoveClient;
begin
  with SocketDispatcher do
    if Assigned(OnRemoveClient) then OnRemoveClient(SocketDispatcher, Self);
end;

{ TSocketDispatcherThread.IUnknown }

function TSocketDispatcherThread.QueryInterface(const IID: TGUID;
  out Obj): HResult;
begin
  if GetInterface(IID, Obj) then Result := 0 else Result := E_NOINTERFACE;
end;

function TSocketDispatcherThread._AddRef: Integer;
begin
  Inc(FRefCount);
  Result := FRefCount;
end;

function TSocketDispatcherThread._Release: Integer;
begin
  Dec(FRefCount);
  Result := FRefCount;
end;

{ TSocketDispatcherThread.ISendDataBlock }

function TSocketDispatcherThread.Send(const Data: IDataBlock;
  WaitForResult: Boolean): IDataBlock;
begin
  FTransport.Send(Data);
  if WaitForResult then
    while True do
    begin
      Result := FTransport.Receive(True, 0);
      if Result = nil then break;
      if (Result.Signature and ResultSig) = ResultSig then
        break else
        FInterpreter.InterpretData(Result);
    end;
end;

procedure TSocketDispatcherThread.ClientExecute;
var
  Data: IDataBlock;
  msg: TMsg;
  Obj: ISendDataBlock;
  Event: THandle;
  WaitTime: DWord;
begin
  CoInitialize(nil);
  try
    Synchronize(AddClient);
    FTransport := CreateServerTransport;
    try
      Event := FTransport.GetWaitEvent;
      PeekMessage(msg, 0, WM_USER, WM_USER, PM_NOREMOVE);
      GetInterface(ISendDataBlock, Obj);
      if FRegisteredOnly then
        FInterpreter := TDataBlockInterpreter.Create(Obj, SSockets) else
        FInterpreter := TDataBlockInterpreter.Create(Obj, '');
      try
        Obj := nil;
        if FTimeout = 0 then
          WaitTime := INFINITE else
          WaitTime := 60000;
        while not Terminated and FTransport.Connected do
        try
          case MsgWaitForMultipleObjects(1, Event, False, WaitTime,
           QS_ALLEVENTS) of
            WAIT_OBJECT_0:
            begin
              WSAResetEvent(Event);
              Data := FTransport.Receive(False, 0);
              if Assigned(Data) then

Секция 1 из 2 - Предыдущая - Следующая

Вернуться в раздел "Языки Pascal/Delphi" - Обсудить эту статью на Форуме
Главная - Поиск по сайту - О проекте - Форум - Обратная связь

© faqs.org.ru