Секция 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 - Предыдущая - Следующая
© faqs.org.ru