Уроки по работе с сокетами на пхп
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Уроки по работе с сокетами на пхп - 2009-12-22 12:45:49.490000
|
|
|
codeismy.name
Сообщений: 618
Оценки: 0
Присоединился: 2009-07-19 00:30:13.200000
|
предлогаю модераторам закрепить эту тему так как вопросы по обмену пакетами с сервером через сокеты возникают достаточно часто собственно небольшой туториал о том как вообще работать с сокетами в пхп <?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);
}
?> а теперь по кусочкам разберём данный пример даный код отправит методом POST переменные content и source аналогично из формы вида quote:
<form method="POST" action="/index.php"><input type="text" name="content" /><input type="text" name="source" /><input type="submit" /></form> обращаю ваше внимание на то, что в данном примере вы контент отправляемый сначала кодируем с помощью urlencode() это необходимо для коректной передачи данных в скрипт.
|
|
|
RE: Уроки по работе с сокетами на пхп - 2009-12-23 10:58:29.660000
|
|
|
codeismy.name
Сообщений: 618
Оценки: 0
Присоединился: 2009-07-19 00:30:13.200000
|
итак, самый простой пример работы с сокетами мы рассмотрели, теперь как пологается от простого к сложному :) сегоня я хочу рассказать как надо общаться с POP3 сервером через сокеты урок подготовлен на базе материалов: Почтовый стандарт «MIME» (RFC1521) первым делом мы должны подключиться к серверу <?
$pop_conn = fsockopen("pop.bk.ru", 110,$errno, $errstr, 10); //открываем сокет
print fgets($pop_conn,1024); //читаем ответ
?> Если все нормально, ответ будет: +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 - завершение сессии (по окончанию сессии все помеченые на удаления письма удалятся) ну а дальше приведу ряд полезных функций: получение ответа от сервера <?
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; //возвращяем результат
}
?> <? При отправке почты, все не латинские символы в заголовках кодируется, например тема письма может выглядеть так =?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");
}
}
|
|
|
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, как это показано ниже: <html>
<head>
<title>IP information</title>
</head>
<bоdу>
<center>
<FORM action=ip.php method=post>
<br>
</i></b></font>
<br>
<INPUT type=text name=ip size=35>
<input type=submit value='Введите IP-адрес'>
</form>
</center>
<?
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))."<br>");
}
}
fclose ($sock);
}
?>
</bоdу>
</html>
|
|
|
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, код будет работать быстрее и упростится немного :)
|
|
|
RE: Уроки по работе с сокетами на пхп - 2010-09-26 15:46:05.340000
|
|
|
Golune
Сообщений: 29
Оценки: 0
Присоединился: 2010-01-28 13:25:35.636666
|
Хочу при помощи сокетов загружать страницу с другого сайта, но при при этом возникают проблемы с кодировкой. Как устанавливать кодировку в сокетах?
|
|
|
RE: Уроки по работе с сокетами на пхп - 2010-11-22 16:57:31.956666
|
|
|
AloneMonaX
Сообщений: 106
Оценки: 0
Присоединился: 2009-02-04 14:57:00.896666
|
А зачем в сокетах ее указывать? Я сталкивался раньше, решил обычным перекодированием полученной страницы, в моем случае, в utf-8, и последующим выводом на страницу)
|
|
|
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); а кодировку стека ты никак не установиш
|
|
|
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
|
|
|
RE: Уроки по работе с сокетами на пхп - 2011-10-09 16:43:08.510000
|
|
|
dummok
Сообщений: 2
Оценки: 0
Присоединился: 2011-07-08 15:31:20.916666
|
Здравствуйте, у меня вопрос, если я напишу через сокеты клиент на С++ и сервер на php они будут взаимодействовать?
|
|
|
[Deleted] - 2011-12-09 16:25:28.360000
|
|
|
Deleted User
Сообщений: -1459
Оценки: 0
Присоединился: None
|
[Deleted by Admins]
|
|
|
|
|