Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Уроки по работе с сокетами на пхп

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Веб-программинг] >> Уроки по работе с сокетами на пхп
Имя
Сообщение << Старые топики   Новые топики >>
Уроки по работе с сокетами на пхп - 2009-12-22 12:45:49.490000   
codeismy.name

Сообщений: 618
Оценки: 0
Присоединился: 2009-07-19 00:30:13.200000
предлогаю модераторам закрепить эту тему так как вопросы по обмену пакетами с сервером через сокеты возникают достаточно часто

собственно небольшой туториал о том как вообще работать с сокетами в пхп
&lt;?php $data.="content=".urlencode($cont); $data.="&source=".urlencode($source); if($fp = fsockopen($host, 80, $errno, $errstr, 10)) { $out = "POST /index.php HTTP/1.1\n"; $out .= "Host: ".$host."\n"; $out .= "Referer: ".$host."/\n"; $out .= "User-Agent: Opera\n"; $out .= "Content-Type: application/x-www-form-urlencoded\n"; $out .= "Content-Length: ".strlen($data)."\n\n"; $out .= $data."\n\n"; fputs($fp, $out); fclose($fp); } ?&gt; а теперь по кусочкам разберём данный пример
даный код отправит методом POST переменные content и source аналогично из формы вида
quote:

&lt;form method="POST" action="/index.php"&gt;&lt;input type="text" name="content" /&gt;&lt;input type="text" name="source" /&gt;&lt;input type="submit" /&gt;&lt;/form&gt;

обращаю ваше внимание на то, что в данном примере вы контент отправляемый сначала кодируем с помощью urlencode() это необходимо для коректной передачи данных в скрипт.
Post #: 1
RE: Уроки по работе с сокетами на пхп - 2009-12-23 10:58:29.660000   
codeismy.name

Сообщений: 618
Оценки: 0
Присоединился: 2009-07-19 00:30:13.200000
итак, самый простой пример работы с сокетами мы рассмотрели, теперь как пологается от простого к сложному :)
сегоня я хочу рассказать как надо общаться с POP3 сервером через сокеты
урок подготовлен на базе материалов: Почтовый стандарт «MIME» (RFC1521)

первым делом мы должны подключиться к серверу
&lt;? $pop_conn = fsockopen("pop.bk.ru", 110,$errno, $errstr, 10); //открываем сокет print fgets($pop_conn,1024); //читаем ответ ?&gt; Если все нормально, ответ будет: +OK
далее нам необходимо авторизироваться
<?
fputs($pop_conn,"USER code@codeismy.name\r\n"); //посылаем юзера
print fgets($pop_conn,1024); //читаем ответ
?>
Ответ: +OK Password required for user code@codeismy.name
Вводим пароль с помощью команды PASS
<?
fputs($pop_conn,"PASS password\r\n"); //посылаем пароль
print fgets($pop_conn,1024);
?>
Ответ: +OK code@codeismy.name maildrop has 2 messages (8192 octets)
В данном ответе говорится, что в ящике 2 письма общим размером 8192 байт.
Когда авторизация пройдена и можно получить информацию командой STAT, она покажет сколько писем в ящике и их общий размер
<?
fputs($pop_conn,"STAT\r\n");
print fgets($pop_conn,1024);
?>
получить весь список писем можно командой LIST
<?
fputs($pop_conn,"LIST\r\n");
print fgets($pop_conn);
?>
Покажет такой ответ:
+OK 2 messages (8192 octets)
1 6654
2 1372
так же если для команды LIST указать номер письма то можно получить информацию только об этом письме
дальше просто приведу список наиболее часто используемых команд
TOP - имеет 2 параметра номер письма и число строк из заголовка, на пример TOP 1 10 покажет заголочки и первые 10 строк письма
DELE - помечает для удаления письмо
RSET - отменяет пометку на удаление
RETR - прочесть письмо полностью
QUIT - завершение сессии (по окончанию сессии все помеченые на удаления письма удалятся)

ну а дальше приведу ряд полезных функций:
получение ответа от сервера
&lt;? function get_data($pop_conn) { $data=""; while (!feof($pop_conn)) { $buffer = chop(fgets($pop_conn,1024)); $data .= "$buffer\r\n"; //склеиваем строки if(trim($buffer) == ".") break; } return $data; //возвращяем результат } ?&gt;
<?
При отправке почты, все не латинские символы в заголовках кодируется, например тема письма может выглядеть так =?windows-1251?B?7/Du4uXw=?= вот такие тексты и будет преобразовывать эта функция function decode_mime_string($subject) { $string = $subject; if(($pos = strpos($string,"=?")) === false) return $string; while(!($pos === false)) { $newresult .= substr($string,0,$pos); $string = substr($string,$pos+2,strlen($string)); $intpos = strpos($string,"?"); $charset = substr($string,0,$intpos); $enctype = strtolower(substr($string,$intpos+1,1)); $string = substr($string,$intpos+3,strlen($string)); $endpos = strpos($string,"?="); $mystring = substr($string,0,$endpos); $string = substr($string,$endpos+2,strlen($string)); if($enctype == "q") $mystring = quoted_printable_decode(ereg_replace("_"," ",$mystring)); else if ($enctype == "b") $mystring = base64_decode($mystring); $newresult .= $mystring; $pos = strpos($string,"=?"); } $result = $newresult.$string; if(ereg("koi8", $subject)) $result = convert_cyr_string($result, "k", "w"); if(ereg("KOI8", $subject)) $result = convert_cyr_string($result, "k", "w"); return $result; }
перекодировщик тела письма. Само письмо может быть закодировано и данная функция приводит тело письма в нормальный вид. Так же и вложенные файлы будут перекодироваться этой функцией.
function compile_bоdу($bоdу,$enctype,$ctype) { $enctype = explode(" ",$enctype); $enctype = $enctype[0]; if(strtolower($enctype) == "base64") $bоdу = base64_decode($bоdу); elseif(strtolower($enctype) == "quoted-printable") $bоdу = quoted_printable_decode($bоdу); if(ereg("koi8", $ctype)) $bоdу = convert_cyr_string($bоdу, "k", "w"); return $bоdу; } Функция для выдергивания метки boundary из заголовка Content-Type boundary это разделитель между разным содержимым в письме, например, чтобы отделить файл от текста письма
function get_boundary($ctype){ if(preg_match('/boundary[ ]?=[ ]?(["]?.*)/i',$ctype,$regs)) { $boundary = preg_replace('/^\"(.*)\"$/', "\\1", $regs[1]); return trim("--$boundary"); } }
Post #: 2
RE: Уроки по работе с сокетами на пхп - 2009-12-23 11:16:41.820000   
ex_machine

Сообщений: 337
Оценки: 0
Присоединился: 2008-08-15 10:22:03.140000
Функция fsockopen предназначена для соединения клиента с сервером. Она очень удобна, поскольку является универсальной и объединяет в себе те функции, которые есть в PHP для работы с сокетами. Функция имеет следующий синтаксис:

int fsockopen (string target, int port [, int errno [, string errstr
[, float timeout]]])

Первый аргумент функции представляет собой URL хоста target, с которым необходимо соединиться, второй — номер порта port по которому произойдет соединение. Необязательный аргумент errno указывает на номер ошибки, а errstr содержит текст сообщения об ошибке. Аргумент timeout позволяет указать количество секунд, в течение которого устанавливается соединение.
Практический пример с использованием функции fsockopen

В этом примере мы разработаем простое приложение, позволяющее пользователю узнать на кого и где зарегистрирован IP-адрес. Для этого мы с помощью функции fsockopen установим соединение с сервером whois.ripe.net, как это показано ниже:

&lt;html&gt; &lt;head&gt; &lt;title&gt;IP information&lt;/title&gt; &lt;/head&gt; &lt;bоdу&gt; &lt;center&gt; &lt;FORM action=ip.php method=post&gt; &lt;br&gt; &lt;/i&gt;&lt;/b&gt;&lt;/font&gt; &lt;br&gt; &lt;INPUT type=text name=ip size=35&gt; &lt;input type=submit value='Введите IP-адрес'&gt; &lt;/form&gt; &lt;/center&gt; &lt;? if ($ip!="") { $sock = fsockopen ("whois.ripe.net", 43, $errno, $errstr); if (!$sock) { echo("$errno($errstr)"); return; } else { fputs ($sock, $ip."\r\n"); while (!feof($sock)) { echo (str_replace(":",":      ", fgets ($sock,128))."&lt;br&gt;"); } } fclose ($sock); } ?&gt; &lt;/bоdу&gt; &lt;/html&gt;
Post #: 3
RE: Уроки по работе с сокетами на пхп - 2009-12-24 15:25:54.720000   
codeismy.name

Сообщений: 618
Оценки: 0
Присоединился: 2009-07-19 00:30:13.200000
небольшая поправочка для более универсальной перекодировки ответа POP3 сервера
function decode_mime_string($subject) { $string = $subject; preg_match_all("#\=\?(.*)\?B\?#",$subject,$val); $encoding=strtoupper($val[1][0]); if(($pos = strpos($string,"=?")) === false) return $string; while(!($pos === false)) { $newresult .= substr($string,0,$pos); $string = substr($string,$pos+2,strlen($string)); $intpos = strpos($string,"?"); $charset = substr($string,0,$intpos); $enctype = strtolower(substr($string,$intpos+1,1)); $string = substr($string,$intpos+3,strlen($string)); $endpos = strpos($string,"?="); $mystring = substr($string,0,$endpos); $string = substr($string,$endpos+2,strlen($string)); if($enctype == "q") $mystring = quoted_printable_decode(ereg_replace("_"," ",$mystring)); else if ($enctype == "b") $mystring = base64_decode($mystring); $newresult .= $mystring; $pos = strpos($string,"=?"); } $result = $newresult.$string; if(ereg("koi8", $subject)||ereg("KOI8", $subject)) $result = convert_cyr_string($result, "k", "w"); else if(ereg("utf-8", $subject)||ereg("UTF-8", $subject)) $result = iconv("UTF-8","WINDOWS-1251",$result); else if(!ereg("Windows-1251", $subject)||!ereg("WINDOWS-1251", $subject)||!ereg("windows-1251", $subject)) { $result = iconv($encoding,"WINDOWS-1251",$result); } return $result; } кстати если есть желающие то можете переделать ereg на preg_replace, код будет работать быстрее и упростится немного :)
Post #: 4
RE: Уроки по работе с сокетами на пхп - 2010-09-26 15:46:05.340000   
Golune

Сообщений: 29
Оценки: 0
Присоединился: 2010-01-28 13:25:35.636666
Хочу при помощи сокетов загружать страницу с другого сайта, но при при этом возникают проблемы с кодировкой. Как устанавливать кодировку в сокетах?
Post #: 5
RE: Уроки по работе с сокетами на пхп - 2010-11-22 16:57:31.956666   
AloneMonaX

Сообщений: 106
Оценки: 0
Присоединился: 2009-02-04 14:57:00.896666
А зачем в сокетах ее указывать? Я сталкивался раньше, решил обычным перекодированием полученной страницы, в моем случае, в utf-8, и последующим выводом на страницу)
Post #: 6
RE: Уроки по работе с сокетами на пхп - 2011-01-10 09:06:45.670000   
codeismy.name

Сообщений: 618
Оценки: 0
Присоединился: 2009-07-19 00:30:13.200000
$content=iconv("in_charset","out_charset",$content);
а кодировку стека ты никак не установиш
Post #: 7
RE: Уроки по работе с сокетами на пхп - 2011-04-18 00:46:35.770000   
Simpliest

Сообщений: 4
Оценки: 0
Присоединился: 2011-04-15 11:33:30.213333
Может стоит переименовать тему в "Уроки по подключению к интернет сокетам"
а то как бы в php полное API для работы с сокетами предоставляется http://www.php.net/manual/en/ref.sockets.php
Post #: 8
RE: Уроки по работе с сокетами на пхп - 2011-10-09 16:43:08.510000   
dummok

Сообщений: 2
Оценки: 0
Присоединился: 2011-07-08 15:31:20.916666
Здравствуйте, у меня вопрос, если я напишу через сокеты клиент на С++ и сервер на php они будут взаимодействовать?
Post #: 9
[Deleted] - 2011-12-09 16:25:28.360000   
Deleted User

Сообщений: -1459
Оценки: 0
Присоединился: None
[Deleted by Admins]
Post #: 10
Страниц:  [1]
Все форумы >> [Веб-программинг] >> Уроки по работе с сокетами на пхп







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.