Почти все о работе с сетью
Вообщем щас нашёл .doc документ у себя на компе... а там такое: :cool:
Почти все о работе с сетью.
Предисловие
Часто возникают вопросы по работе с сетью, и конечно, часто возникают ответы. Но так как многим лень пользоваться поиском или глянуть FAQ, то в этой статье я попробую как можно полнее и понятнее собрать материал, найденный мною.
Для начала про FTP:
Приведенная функция скачивает файл по ftp и при этом отображает прогресс скачивания.
Передаются параметры: Хост, с которого качаем; Имя пользователя; Пароль; Порт; Директория файла; Имя файла; Имя полосы отображения прогресса.
Код:
{
The following function shows how to connect to a ftp server
and download a file.
It uses the functions from wininet.dll.
You need a ProgressBar to show the progress and a Label to show progress informations.
}
uses
WinInet, ComCtrls;
function FtpDownloadFile(strHost, strUser, strPwd: string;
Port: Integer; ftpDir, ftpFile, TargetFile: string; ProgressBar: TProgressBar): Boolean;
function FmtFileSize(Size: Integer): string;
begin
if Size >= $F4240 then
Result := Format('%.2f', [Size / $F4240]) + ' Mb'
else
if Size < 1000 then
Result := IntToStr(Size) + ' bytes'
else
Result := Format('%.2f', [Size / 1000]) + ' Kb';
end;
const
READ_BUFFERSIZE = 4096; // or 256, 512, ...
var
hNet, hFTP, hFile: HINTERNET;
buffer: array[0..READ_BUFFERSIZE - 1] of Char;
bufsize, dwBytesRead, fileSize: DWORD;
sRec: TWin32FindData;
strStatus: string;
LocalFile: file;
bSuccess: Boolean;
begin
Result := False;
{ Open an internet session }
hNet := InternetOpen('Program_Name', // Agent
INTERNET_OPEN_TYPE_PRECONFIG, // AccessType
nil, // ProxyName
nil, // ProxyBypass
0); // or INTERNET_FLAG_ASYNC / INTERNET_FLAG_OFFLINE
{
Agent contains the name of the application or
entity calling the Internet functions
}
{ See if connection handle is valid }
if hNet = nil then
begin
ShowMessage('Unable to get access to WinInet.Dll');
Exit;
end;
{ Connect to the FTP Server }
hFTP := InternetConnect(hNet, // Handle from InternetOpen
PChar(strHost), // FTP server
port, // (INTERNET_DEFAULT_FTP_PORT),
PChar(StrUser), // username
PChar(strPwd), // password
INTERNET_SERVICE_FTP, // FTP, HTTP, or Gopher?
0, // flag: 0 or INTERNET_FLAG_PASSIVE
0);// User defined number for callback
if hFTP = nil then
begin
InternetCloseHandle(hNet);
ShowMessage(Format('Host "%s" is not available',[strHost]));
Exit;
end;
{ Change directory }
bSuccess := FtpSetCurrentDirectory(hFTP, PChar(ftpDir));
if not bSuccess then
begin
InternetCloseHandle(hFTP);
InternetCloseHandle(hNet);
ShowMessage(Format('Cannot set directory to %s.',[ftpDir]));
Exit;
end;
{ Read size of file }
if FtpFindFirstFile(hFTP, PChar(ftpFile), sRec, 0, 0) <> nil then
begin
fileSize := sRec.nFileSizeLow;
// fileLastWritetime := sRec.lastWriteTime
end else
begin
InternetCloseHandle(hFTP);
InternetCloseHandle(hNet);
ShowMessage(Format('Cannot find file ',[ftpFile]));
Exit;
end;
{ Open the file }
hFile := FtpOpenFile(hFTP, // Handle to the ftp session
PChar(ftpFile), // filename
GENERIC_READ, // dwAccess
FTP_TRANSFER_TYPE_BINARY, // dwFlags
0); // This is the context used for callbacks.
if hFile = nil then
begin
InternetCloseHandle(hFTP);
InternetCloseHandle(hNet);
Exit;
end;
{ Create a new local file }
AssignFile(LocalFile, TargetFile);
{$i-}
Rewrite(LocalFile, 1);
{$i+}
if IOResult <> 0 then
begin
InternetCloseHandle(hFile);
InternetCloseHandle(hFTP);
InternetCloseHandle(hNet);
Exit;
end;
dwBytesRead := 0;
bufsize := READ_BUFFERSIZE;
while (bufsize > 0) do
begin
Application.ProcessMessages;
if not InternetReadFile(hFile,
@buffer, // address of a buffer that receives the data
READ_BUFFERSIZE, // number of bytes to read from the file
bufsize) then Break; // receives the actual number of bytes read
if (bufsize > 0) and (bufsize <= READ_BUFFERSIZE) then
BlockWrite(LocalFile, buffer, bufsize);
dwBytesRead := dwBytesRead + bufsize;
{ Show Progress }
ProgressBar.Position := Round(dwBytesRead * 100 / fileSize);
Form1.Label1.Caption := Format('%s of %s / %d %%',[FmtFileSize(dwBytesRead),FmtFileSize(fileSize) ,ProgressBar.Position]);
end;
CloseFile(LocalFile);
InternetCloseHandle(hFile);
InternetCloseHandle(hFTP);
InternetCloseHandle(hNet);
Result := True;
end;
Про E-Mail:
Отправляем письмо из почтового клиента, используемого по умолчанию:
Код:
uses SHELLAPI;
procedure AutoSendMail;
var
EMailDestinationString, SubjectString, Line1String,
Line2String, mailstring: string;
begin
EMailDestinationString := 'gbamber@bamber.com';
SubjectString := 'Message Subject';
Line1String := 'This is the first line';
Line2String := 'This is the second line';
// Можно использовать несколько адресов, разделяя их точкой с запятой
mailstring := 'mailto:' + EMailDestinationString +
'?subject=' + SubjectString +
'&body=' + Line1String +
'%0d' + Line2String;
if (ShellExecute(0, 'open', PChar(mailstring), '', '',
SW_SHOWNORMAL) <= 32) then
ShowMessage('Auto method failed.');
end;
Пишем письмо незаметно от пользователя по протоколу SMTP:
Код:
{
smtp - ip адрес smtp сервера
port - порт smtp сервера, по умолчанию 25
from - адрес отправителя
dest - адрес получателя
subject - тема письма
body - текст писма
Возвращает True если письмо было успешно отправленно...
}
function mail(smtp: string; port: integer; from, dest, subject,
body: string): bool;
const
cl = #13#10;
var
WSAData: TWSAData;
Host: TSockAddrIn;
Sock: TSocket;
res: Integer;
buff: array[1..255] of Char;
{ отправляем данные через сокет }
procedure senddata(str: string);
var
i: integer;
begin
for i := 1 to Length(str) do
if send(Sock, str[i], 1, 0) = SOCKET_ERROR then
exit;
end;
{ получаем ответ от команды }
function recvdata(accept: string): bool;
var
buff: array[1..255] of Char;
begin
res := recv(Sock, buff, SizeOf(buff), 0);
Result := (Res = SOCKET_ERROR) or (Copy(buff, 1, 3) = accept);
end;
begin
try
result := false;
{ инициализация сокета }
WSAStartUp(257, WSAData);
Sock := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if Sock = INVALID_SOCKET then
Exit;
{ устанавливаем хост и порт сервера }
res := inet_addr(PChar(smtp));
if res <= 0 then
exit;
Host.sin_family := AF_INET;
Host.sin_port := htons(port);
Host.sin_addr.S_addr := res;
{ подключаемся к серверу }
if connect(Sock, Host, SizeOf(Host)) > 0 then
Exit;
{ приветствие сервера }
if not recvdata('220') then
Exit;
{ EHLO }
senddata('EHLO' + cl);
if not recvdata('250') then
Exit;
{ MAIL FROM: }
senddata('MAIL FROM:' + from + cl);
if not recvdata('250') then
Exit;
{ RCPT TO: }
senddata('RCPT TO:' + dest + cl);
if not recvdata('250') then
Exit;
{ DATA }
senddata('DATA' + cl);
if not recvdata('354') then
Exit;
{ отправляем текст сообщения }
senddata('Subject:' + subject + cl + cl + body + cl + '.');
if not recvdata('250') then
Exit;
{ отключаемся от сервера }
senddata('QUIT' + cl);
result := true;
finally
{ убиваем сокет }
closesocket(sock);
WSACleanup;
end;
end;
{
mail('127.0.0.1',25,'bboy-ne@yandex.ru' ,'admin@company.mail', 'subj', 'body text');
}
TCP-IP
Свой IP:
Код:
uses
WinSock;
function GetLocalIP: String;
const WSVer = $101;
var
wsaData: TWSAData;
P: PHostEnt;
Buf: array [0..127] of Char;
begin
Result := '';
if WSAStartup(WSVer, wsaData) = 0 then begin
if GetHostName(@Buf, 128) = 0 then begin
P := GetHostByName(@Buf);
if P <> nil then Result := iNet_ntoa(PInAddr(p^.h_addr_list^)^);
end;
WSACleanup;
end;
end;
Получаем IP из Host:
Код:
uses
WinSock;
const
WINSOCK_VERSION = $0101;
function GetIPAddress(name: string): string;
var
WSAData: TWSAData;
p: PHostEnt;
begin
WSAStartup(WINSOCK_VERSION, WSAData);
p := GetHostByName(PChar(name));
Result := inet_ntoa(PInAddr(p.h_addr_list^)^);
WSACleanup;
end;
Или так:
Код:
function HostToIP(Name: string): String;
var
wsdata : TWSAData;
hostName: array [0..255] of char;
hostEnt : PHostEnt;
addr : PChar;
begin
Result:= '';
WSAStartup($0101, wsdata);
try
GetHostName(HostName, SizeOf(hostName));
StrPCopy(hostName, Name);
hostEnt:= gethostbyname(hostName);
if not Assigned(hostEnt ) then Exit;
if not Assigned(hostEnt^.h_addr_list) then exit;
addr:= hostEnt^.h_addr_list^;
if not Assigned(addr ) then Exit;
Result:= Format('%d.%d.%d.%d', [Ord(addr[0]), Ord(addr[1]), Ord(addr[2]), Ord(addr[3])]);
finally
WSACleanup;
end
end;
Если кто-то работает с Telnet:
Код:
создание файлового архива tar, cpio
архивация файла compress, pack
замер времени исполнения команды time, timex
запуск программы в указанное время at
вывод файла на экран cat, page, dtpad, textedit. xedit
постраничный вывод файла на экран more
вывод на экран первых десяти строк файла head
вывод на экран последних десяти строк файла tail
вывод содержимого заархивированного файла peat
выполнение вычислений be, dc
вывод даты и времени date
изменение даты модификации файла на текущую touch
деархивация файла unpack, uncompress
декодирование UU-кода uudecode
вывод объема свободного дискового пространства df
вывод объема дискового пространства,
занятого данным каталогом du
завершение работы exit
печать заголовка banner
захват изображения на экране xv, xwd
печать изображений xdpr, xpr
вывод имени системы uname
запуск интерпретатора командной строки sh, csh, ksh
запуск интерпретатора командной строки на удаленной системе rsh
личный календарь cm, dtcm
вывод календаря cal, cm, dtcm
калькулятор calctool, dtcalc, xcalc
создание каталога mkdir, filemgr dtfile
вывод размера каталога du
вывод списка файлов и подкаталогов данного каталога Is
смена текущего каталога cd
удаление каталога rmdir, filemgr, dtfile
вывод имени текущего каталога pwd
сравнение содержимого двух каталогов dircmp
UU-кодирование файла для пересылки его по электронной почте uuencode
выполнение команды в указанное время at
ввод команды при работе с графическим интерфейсом xterm, dtterm, shelltool
компиляция С-программ, копирование файлов cat, cp, filemgr, dtfile
копирование файлов на удаленную систему и с удаленной системы гср
копирование файлов между UNIX-системами uucp
вычисление контрольной суммы файла sum
нумерация строк текстового файла n1
объединение нескольких файлов в один cat
объединение отсортированных файлов по общему полю join
объединение файлов в качестве двух столбцов paste
вывод или установка значений переменных окружения env
ожидание завершения процесса wait
отправка сообщения другому пользователю write
очистка экрана clear
вывод состояния службы печати Ipstat
запуск службы печати Ipsched
останов службы печати Ipshut
печать заголовка banner
персональный календарь calendar, cm, dtcm
подсчет количества слов в текстовом файле we
выполнение повторяющихся задач crontab
поиск текстовых строк egrep, grep, fgrep
поиск и замена символов tr
поиск в файле awk, nawk
поиск файлов find
вывод списка пользователей listusers
вывод информации о других пользователях системы who
поиск информации о других пользователях системы finger
выполнение последовательности команд batch
запуск команды с пониженным приоритетом nice
проверка правописания spell
прерывание процесса kill
вывод списка процессов PS
присоединение содержимого файлов к существующему файлу cat
разбиение файла на части csplit, split
редактирование текстового файла vi, ed, dtpad, textedit,
xedit
резервирование информации tar, cpio
поиск и замена символов tr
вывод списка известных систем uuname
вывод системного идентификатора пользователя id
вывод системных сообщений news
подсчет числа слов в файле we
вывод состояния службы UUCP uustat
создание нового текстового файла cat, dtpad, textedit,
xedit
установка соединения с удаленным
терминалом ct
установка соединения с удаленной
UNIX-системой cu
разрешение/запрет вывода сообщений на
терминал mesg
вывод сообщений news
сортировка файла sort
сортировка и обработка файла awk, nawk
вывод состояния машин в сети ruptime
вывод списка файлов в каталоге Is
сравнение содержимого двух каталогов dircmp
сравнение содержимого двух отсортированных файлов comm
сравнение трех файлов diff3
сравнение двух файлов и вывод отличающихся строк diff, bdiff
сравнение двух файлов cmp
сравнение двух файлов и вывод
отличающихся и совпадающих строк sdiff
создание ссылок In
печать на стандартный вывод echo
запись стандартного вывода в файл tee
вывод столбца из отсортированного файла cut
поиск текстовых строк в бинарном файле strings
поиск текстовых строк egrep, grep, fgrep
табличный процессор tbi
настройка табуляции tabs
смена текущего каталога cd
вывод имени текущего каталога pwd
открытие окна терминала xterm,
dtterm,
shelltool
вывод информации о терминале tput
настройка конфигурации терминала stty
вывод параметров терминала tty
определение типа файла file
удаление из очереди заданий, созданных
командой at atrm
удаление заданий из очереди печати cancel
удаление каталога rmdir,
filemgr,
dtfile
удаление файла rm, filemgr,
dtfile
удаление форматирующих символов
из файла col
копирование файлов с удаленной системы rep, uucp,
ftp
выполнение команды на удаленной системе uux
запуск интерпретатора командной строки на
удаленной системе rsh
вход в удаленную систему telnet,
riogin
вывод информации о соединениях с
удаленными системами uulog
создание нового текстового файла cat, dtpad,
textedit,
xedit
изменение даты модификации файла на
текущую touch
вывод полного имени файла basename
вывод файла на экран cat, page, dtpad, textedit, xedit
постраничный вывод файла на экран more
вывод на экран первых десяти строк файла head
вывод на экран последних десяти строк файла tail
вывод списка файлов в каталоге Is
копирование файла cat, cp, filemgr, dtfile
определение типа файла file
поиск файла find
разбиение файла split
редактирование файла vi, ed, dtpad. textedit, xedit
удаление файла rm
шифрование файла crypt
печать формул eqn, neqn
отображение шрифта xfd, xfontsel
вывод списка доступных шрифтов xlsfonts, fslsfonts
отправка и чтение электронной почты mailx, dtmail, mailtool
уведомление о получении новых писем по электронной почте notify, xbiff
Проверяем, есть-ли URL:
Код:
uses wininet;
function CheckUrl(url: string): boolean;
var
hSession, hfile, hRequest: hInternet;
dwindex, dwcodelen: dword;
dwcode: array [1..20] of char;
res: pchar;
begin
if pos('http://', lowercase(url)) = 0 then
url := 'http://'+url;
Result := false;
hSession := InternetOpen('InetURL:/1.0', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
if assigned(hsession) then
begin
hfile := InternetOpenUrl(hsession, pchar(url), nil, 0, INTERNET_FLAG_RELOAD, 0);
dwIndex := 0;
dwCodeLen := 10;
HttpQueryInfo(hfile, HTTP_QUERY_STATUS_CODE, @dwcode, dwcodeLen, dwIndex);
res := pchar(@dwcode);
result := (res = '200') or (res = '302');
if assigned(hfile) then
InternetCloseHandle(hfile);
InternetCloseHandle(hsession);
end;
end;
Dial-Up соединения:
Разорвать соединение:
Код:
type
TRasConn = record
Size: DWORD;
Handle: THandle;
Name: array[0..20] of AnsiChar;
end;
TRasEnumConnections = function(var RasConn: TRasConn; var Size: DWORD;
var Connections: DWORD): DWORD stdcall;
TRasHangUp = function(Handle: THandle): DWORD stdcall;
function DisconnectDialUp: Boolean;
var
Lib: HINST;
RasEnumConnections: TRasEnumConnections;
RasHangUp: TRasHangUp;
RasConn: TRasConn;
Code, Size, Connections: DWORD;
begin
Result := True;
try
Lib := LoadLibrary('rasapi32.dll');
try
if Lib = 0 then
Abort;
RasEnumConnections := GetProcAddress(Lib, 'RasEnumConnectionsA');
if not Assigned(@RasEnumConnections) then
Abort;
RasHangUp := GetProcAddress(Lib, 'RasHangUpA');
if not Assigned(@RasHangUp) then
Abort;
FillChar(RasConn, SizeOf(RasConn), 0);
RasConn.Size := SizeOf(RasConn);
Code := RasEnumConnections(RasConn, Size, Connections);
if (Connections <> 1) or (Code <> 0) then
Abort;
if RasHangUp(RasConn.Handle) <> 0 then
Abort;
Sleep(3000);
finally
FreeLibrary(Lib);
end;
except
on E: EAbort do
Result := False;
else
raise;
end;
end;
Пример использования:
if DisconnectDialUp = true then
ShowMessage('Соединение разорвано')
else
ShowMessage('Не удалось разорвать соединение');
Набрать номер модемом
Код:
var
hCommFile: THandle;
procedure TForm1.Button1Click(Sender: TObject);
var
PhoneNumber: string;
CommPort: string;
NumberWritten: LongInt;
begin
PhoneNumber := 'ATDT 1-555-555-1212' + #13 + #10;
CommPort := 'COM2';
{Open the comm port}
hCommFile := CreateFile(PChar(CommPort), GENERIC_WRITE, 0, nil,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if hCommFile=INVALID_HANDLE_VALUE then
begin
ShowMessage('Unable to open '+ CommPort);
exit;
end;
NumberWritten:=0;
if WriteFile(hCommFile, PChar(PhoneNumber)^, Length(PhoneNumber),
NumberWritten, nil) = false then
ShowMessage('Unable to write to ' + CommPort);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
{Close the port}
CloseHandle(hCommFile);
end;
|