|
|
|
| Помогите разобраться с сокетами.
Нужно например сделать запрос к сайту на 80 порт, к определенной странице и с определенным GET запросом например к:
http://softtime.ru/forum/addtheme.php?id_forum=1
Ничего не выходит, у меня вот наваял, но каждый раз получаю индексную страницу, к какой то отдельно странице ни как не обратиться :(
Как правильно составить запрос к сокету на порт 80 ?
$url_info[path] = "/forum/addtheme.php";
$url_info[host] = "softtime.ru";
$url_info[query] = "?id_forum=1";
$query = "POST " . $url_info[path] . " HTTP/1.1\r\n";
$query = $query . "Content-Type: text/xml\r\n";
$query = $query . "Host: " . $url_info[host] . "\r\n";
$query = $query . "Content-length: " . (strlen($url_info[query])) . "\r\n\r\n";
$query = $query . $url_info[query];
$sock = fsockopen($url_info[host], $url_info[port], $errno, $error, 30);
stream_set_blocking($sock, 0);
stream_set_timeout($sock, 3600);
fputs($sock, $query);
if (!$sock)
{
echo("$errno($errstr)");
return;
}
else
{
while (!feof($sock))
{
$tmp = fgets ($sock,128);
}
}
|
| |
|
|
|
|
|
|
|
для: trix
(27.07.2008 в 18:30)
| | 1. если вставляете сюда на форуме пхп-код, обосабливайте его тегами <?php и ?>, чтобы он подсвечивался как надо.
2. пропустили $url_info['port']
3. нужно наверное не так
$tmp = fgets ($sock,128);
| а так
$tmp .= fgets ($sock,128);
| В первом случае $tmp будет содержать пустоту, так как данные в нее (переменную) не дописываются, а каждый раз удаляют предыдущее, и записывают новое. А при втором $tmp будет содержать весь ответ от сервера.
4. у меня этот самый скрипт нормально работает, с исправлениями которые я сказал выше. | |
|
|
|
|
|
|
|
для: noob
(27.07.2008 в 18:56)
| | o_O Работает и правда !! Хмм стоит все рассписать для форума все и зарботало :)
Но возник другой вопрос, работает скрипт вроде но как-то крива, предыдущий пример все ок выдает а если например сделать на другую страницу в результате выдает не то что на самом деле на этой странице должно быть:
<?php
$url_info[path] = "/forum/read.php";
$url_info[host] = "softtime.ru";
$url_info[query] = "?id_forum=2&id_theme=51896";
$url_info[port] = 80;
?>
|
или вот еще для примера адрес:
http://www.webnames.ru/scripts/whois.pl?domain_name=100.100.100.100
через броузер нормально заходит, а через скрипт выдает ошибку 302
<?php
$url_info[path] = "/scripts/whois.pl";
$url_info[host] = "webnames.ru";
$url_info[query] = "?domain_name=100.100.100.100";
$url_info[port] = 80;
?>
|
На некоторых сайтах, выдает ошибку времени выполнения скрипта ! Почему так, гдето работает нормально а гдето нет ? | |
|
|
|
|
|
|
|
для: trix
(27.07.2008 в 20:37)
| | 302 - это не ошибка. Смотрите, что означает 302. | |
|
|
|
|
|
|
|
для: Trianon
(27.07.2008 в 21:19)
| | 302 Found HTTP_FOUND - Запрошенный ресурс был временно перемещен на новый URI.
Это ничего не объясняет :) Данная страница из броузера нормально открывается без всяких переадресаций, а через скрипт 302 Found имеем !? Почему так ? | |
|
|
|
|
|
|
|
для: trix
(27.07.2008 в 21:36)
| | >302 Found HTTP_FOUND - Запрошенный ресурс был временно перемещен на новый URI.
Данная страница из броузера нормально открывается без всяких переадресаций,
Это не так.
Браузер тоже получает такой отклик и честно идет за контентом на новый URL, сообщенный ему сервером в одном из полей отклика.
Я даже подскажу в каком - Location:
И таких прыжков, перед тем как показать страницу, браузер может сделать не один и не два.
Кроме того, перед тем как прыгнуть, браузер обычно будет вынужден еще кое чем заняться.
Сообщенные кукисы записать, например.
Резюме. Читайте стандарт. Просто так сказать "гоп" не выйдет. Придется сперва попрыгать. | |
|
|
|
|
|
|
|
для: Trianon
(27.07.2008 в 21:41)
| | Т.е. скрипт работает правильно ? Это уже радует :)
А может ссылочку покинете где почитать можно ? А то ни как ничего вразумительного не найти ! | |
|
|
|
|
|
|
|
для: trix
(27.07.2008 в 21:51)
| | Вот здесь пара ссылок
В моей реплике 19.07.2008 в 12:42 | |
|
|
|
|
|
|
|
для: Trianon
(27.07.2008 в 21:56)
| | Еще вот в продолжение темы! Может кто подскажет как данный например скрипт запустить через прокси, вот в нете нашел что-то но не работает!
<?php
$ip = "89.114.53.98";
$port = "8368";
$socks=fsockopen($ip,$port); //открываем соединение с прокси
if ($socks)
{
$h=hex2bin('05 01 00'); // передаем версию сокса , кол-во методов аутентификации и методы аутентификации
fwrite($socks,$h);
$list=bin2hex(fread($socks,2));// переводим ответ сокса в нормальный hex'овый вид
// проверяем на версию и метод аутентификации,
if ($list == '0500')
{
$list="";
$len=dechex(strlen($connect_host)); // длина адреса,переводится в шестнадцатиричный режим
$len=len_test($len);
$h=hex2bin("05 01 00 03 $len ".hex($server)." 00 ".dechex(80).""); //формируем запрос $server - //адресат и его порт (например яндекс)
fwrite($socks,$h);
$head = "GET / HTTP/1.0\r\n";
$head .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 8.52\r\n";
$head .= "Host: www.yandex.ru\r\n";
$head .= "Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\n";
$head .= "Accept-Language: ru,en;q=0.9\r\n";
$head .= "Accept-Charset: windows-1252, utf-8, utf-16, iso-8859-1;q=0.6, *;q=0.1\r\n";
$head .= "Proxy-Connection: close\r\n\r\n";
fwrite($socks, $head);
while (!feof($socks))
{
$tmp = fgets ($socks,128);
print $tmp;
}
}
}
?>
|
Идея как я понимаю в том, сначала коннектимся к прокси, затем посылаем прокси адрес нужного домена и порт, затем на прокси отсылаем заголовки и в теории он должен выдать ответ от домена.
Но не работает, возможно я не правильно адрес и порт домена отсылаю? | |
|
|
|
|
|
|
|
для: trix
(28.07.2008 в 15:13)
| | если тип прокси HTTP то достаточно так
<?
$url="http://yoip.ru/"; # адрес сайта, с путем (например это могло бы быть http://yoip.ru/hz/chto/)
$domain="yoip.ru"; # домен сайта, можно www.yoip.ru
$ip="***.***.***.***"; # IP прокси
$port="**"; # порт прокси
$fp=fsockopen($ip, $port);
$header="GET $url HTTP/1.0\r\n".
"Host: $domain\r\n\r\n";
fputs($fp, $header);
$response="";
while (!feof($fp)) {
$response.=fgets($fp);
}
echo "<pre>".$response."</pre>";
?>
|
Это пример с минимальными хедерами через прокси HTTP типа. Так же тут не учитываются никакие таймауты... просто для наглядности. Если прокси рабочий, то скрипт будет работать.
А пот если типа прокси SOCK, тогда не знаю как... | |
|
|
|
|
|
|
|
для: pav1uxa
(28.07.2008 в 15:42)
| | Спасибо за ответ, для понимания полезно :)
Но надо бы конечно SOCKS там немного по другому, нужно команды в бинарный вид переводить, вроде как! | |
|
|
|
|
|
|
|
для: trix
(28.07.2008 в 16:26)
| | Вот тут есть классы сокета с поддержкой sock4\5, так же автоматическим определением типа socks'a. С примером использования.
http://softtime.ru/forum/read.php?id_forum=1&id_theme=48560 | |
|
|
|