Проясните некоторые вопросы по сокетам

Статус
В этой теме нельзя размещать новые ответы.

Bambino

Новичок
Проясните некоторые вопросы по сокетам

Сразу скажу, что учел правила форума и посетил фак, дитэйл и поиск по слову "сокет". Прочитав 9 страниц топиков, ответа на свои вопросы не нашел. Поиск в интернете тоже не привел в положительному результату, поэтому ваши советы - последняя надежда.
Итак, стоит задача осуществлять несколько http-соединений, которое определяется некой переменной $maxthreads, одновременно (необходимо для прокси-чекера). Т.е. необходимо использование неблокирующих сокетов, дабы скрипт не останавливался... Для создания одного коннекта использую fsockopen и socket_set_blocking. Теперь собственно вопросы:

1. Эти несколько соединений (читай сокетов) должны создаваться сразу? Т.е. некий цикл:
PHP:
while ( $maxthreads > count ( $sockets ) ) {
  $sock = fsockopen ( ... );
  socket_set_blocking ( $sock, false );
}
Если алгорит такой, то не будет ли задержки на время пока будут созданы все сокеты? Ведь, если "стандартное" (как в хелпе по fsockopen) время таймаута коннекта 30с и будут проблемные хосты, то получается скрипт зависнет на 30 с? Другой вариант... создается, например, 5-й сокет, а 3-й уже готов для чтения... Как осуществить это чтение, а затем продолжить открывать новые сокеты?

2. В какой момент нужно использовать socket_select? Ведь работа должна осуществляться непрерывно, т.е. один сокет отработал.. закрылся... его идентификатор удаляется из массива сокетов, т.е. появляется возможность создать новый коннект (сокет), пока количество сокетов будет меньше значения $maxthreads.

3. рассмотрим пример из хелпа по socket_select:
PHP:
$talking_socket = socket_select ( ... );
if ( !$talking_socket ) {
  // обработка ошибок (кстати каких?)
} else {
  // здесь по идее мы должны читать из "говорящего" сокета
  fread ( $sockets[$talking_socket], 4096 );
}
Вопрос: может ли быть такое, что сокет сказал, что данные есть, но их меньше 4Кб? Я правильно понимаю, что работа скрипта продолжается и при следующем сигнале socket_select, если в буфере соединения накопится 4Кб, данные будут прочитаны? А если данных в буфере будет больше 4Кб? Тогда следующая порция будет опять считана при следущем сигнале socket_select?

4. Нужно ли использовать таймаут для socket_select? если я правильно понял это время в течение которого функция будет ожидать сокет, который готов что-то "сказать"?

5. socket_set_timeout работает независимо от того блокирующий или неблокирующий сокет используется? Эту функцию нужно использовать перед каждой операцией чтения/записи или можно один раз глобально?

6. Находил в Инете варианты псевдо-многопоточности... там где в цикле создается сокет (как я привел в первом вопросе) и после создания опять бегаем по массиву сокетов и читаем из них... Но если есть такая возможность, то я не пойму принцип использования socket_select... ведь эту функцию тоже нужно опрашивать в цикле, как я понимаю...

7. Есть ли разница между socket_select и stream_select по отношению к сокетам?

Вообщем детали есть, по отдельности все понятно, но собрать воедино не получается. :( Т.е. я не могу увидеть принципиальный алгоритм... В винде вроде понятно, имеем цикл сообщений и события.. пришло событие готовности чтения - читаем, пришло событии готовности записи - пишем... но пхп не событийный и головоломка не складывается... прошу помощи... надеюсь вопросы не очень запутаны...
 

cDLEON

Онанист РНРСlub
PHP:
$sockets[]=socket_create(...);
$sockets[]=socket_create(...);
$tmp=$sockets;
socket_select($tmp,$r,$w=NULL,$o=NULL,1000);
foreach($r as $v)
 {
 socket_recv(...);
 }
 

Bambino

Новичок
Подобный пример я уже видел здесь на форуме, но он не дает четкости понимания... Прошу посмотреть вопрос 1.

PHP:
$sockets[]=socket_create(...); // 1
...
$sockets[]=socket_create(...); // 5-й прокси "лежит", т.е. начинаем ждать таймаут соединения 30 секунд
                                                 // скрипт висит, остальные 5 сокетов не созданы, select не запущен.
...
$sockets[]=socket_create(...); // 10
И далее... судя по всему этот алгоритм не обрабатывает "мертвые" сокеты, т.е. сокет, который уже сделал свое дело и должен быть закрыт, а на его место открыться новый... Т.е. имеем, например, 90 проксей и 10 коннектов... по вашему алгоритму я создаю 10 (максимум) коннектов и запускаю select_socket... допустип 3 сокета отработали быстро, а 7 нет.... я должен закрыть первые 3 и пока остальные 7 еще в работе открыть новые 3 и т.д. Ваш пример позволит обработать только 10 проксей, а как же остальные?

-~{}~ 19.01.07 10:50:

Пожалуйста люди, помогите... Не дайте погибнуть...
Обдумал вариант, предложенный cDLEON'ом.. что-то не получается... :( Ведь socket_select наверняка нужно вызывать в цикле... или как обрабатывать несколько готовых сокетов?
 

cDLEON

Онанист РНРСlub
Bambino
Я тебе описал структуру.
Ты её не понял.
Что ж.... Читай мануал.
ПЫСЫ. После socket_create, нужен ещё socket_connect.
 

Bambino

Новичок
Автор оригинала: cDLEON
Bambino
Я тебе описал структуру.
Ты её не понял.
Что ж.... Читай мануал.
Если бы я понял структуру изначально, я бы и вопрос здесь не задавал... и где тут структура?! Я понимаю как работает структура, я не могу эту структуру переложить на язык... Был бы признателен, если бы кто-то прошелся по вопросам... А то получается как в анекдоте: "-Штурман, приборы"..."-120"...
Автор оригинала: cDLEON ПЫСЫ. После socket_create, нужен ещё socket_connect.
В курсе. А потом еще socket_write, read и close... Мы тут будем соревноваться, кто лучше знает мануал?! Или может действительно поможешь?
 

Bambino

Новичок
Автор оригинала: Фанат
А что за гибель от прокси чекера?
А что за некорректный вопрос?! Я же не трогаю твою личную жизнь...
Автор оригинала: Фанат
Ну, не напишешь ты его - и что? у детей твоих хлеб отнимут?
А если так, то ты готов восполнить потерю, я так понимаю?
И при чем тут мои дети?!

P.S. Правила форума требуют корректно задавать вопросы... я постарался, как смог... Но корректные ответы я смотрю тут до сих пор не дают как и несколько лет назад, когда я был участником данного форума... вот только надписей типа "а ты точно поискал на форуме, нет ли такого ответа?" тогда не было...
P.P.S. Люди, ну неужели сложно ответить по существу? Ну не получается у меня вкурить тему, что мне теперь пойти повеситься, потому что уважаемые гуру не желают опуститься к нам грешным...

PHP:
while ( true )
  $sockets[]=socket_create(...);
  ...
  $tmp=$sockets;
  socket_select($tmp,$r,$w=NULL,$o=NULL,1000);
  foreach($r as $v)  {
    socket_recv(...);
  }
}
? ведь socket_select должен возвращать номер сокета в массиве? Если в таком варианте, то каково его предназначение здесь? Или следующий цикл это как раз и есть "пробежка" по сокетам, которым есть что "сказать"? Но если так, то получается я не выйду из цикла пока не прочитаю всех?

-~{}~ 19.01.07 12:30:

Автор оригинала: Фанат
Мне кажется, тон выбран несколько неверный...
Возможно... извиняюсь.. но не я задал этот тон... насколько я помню, я изначально обратился за помощью.

P.S. Я помню в прошлом ты отвечал на мои вопросы, равно как Demiurg и Tony2000... я могу тебе попросить помочь мне еще раз?
 

Фанат

oncle terrible
Команда форума
Прикольно.
Я задаю вопрос, мне на него отвечают "какое тебе дело?!". и тут же, двумя строчками ниже, пишут "прошу тебя ответить на мой вопрос".
Это логично вообще?
 

Bambino

Новичок
Автор оригинала: Фанат
Прикольно.
Я задаю вопрос, мне на него отвечают "какое тебе дело?!". и тут же, двумя строчками ниже, пишут "прошу тебя ответить на мой вопрос".
Это логично вообще?
ИМХО, логично настолько, насколько логичным был твой вопрос, как ответ на мой вопрос...;)
Может зароем топор "войны"?... возможно был резок, сорри... но мне действительно не к кому больше обратиться... я уже 3 дня бьюсь... уже испробованы все варианты запросов к форуму и гуглу и "кубик рубика" не собирается... точнее мысль где-то вертится, а поймать не могу... документация довольно таки скудная, согласись...
 

Фанат

oncle terrible
Команда форума
А в чем проблема-то? почему такая срочность с прокси-чекером?
Мне всегда казалось, что это приложение не является таким уж жизненно важным.
Тебе трудно ответить на мой вопрос?
 

Bambino

Новичок
Автор оригинала: Фанат
А в чем проблема-то? почему такая срочность с прокси-чекером?
проблема в том, что я хочу организовать сервис по проверки проксей.... и дело тут не в срочности, а во времени как таковом... уже потрачено 3-4 дня... а положительного результата нет... :( я не очень люблю тратить время просто так... далее есть и другая идея организовать смс-рассылку для своего (Ланос-клуба)... и здесь опять мне нужны сокеты, т.е. нормальный класс для работы с сокетами..
Автор оригинала: Фанат
Мне всегда казалось, что это приложение не является таким уж жизненно важным.
Ты забываешь, что у каждого свои жизненные ценности... мы же не клоны друг друга.. А то, что я написал "погибнуть" не стоило воспринимать так буквально.. :) Просто как я уже писал.. потеря времени для меня трагедия.. :).. тем более, это косвенная потеря денег... :D
Автор оригинала: Фанат
Тебе трудно ответить на мой вопрос?
По-моему уже все расписал по полочкам... ;) Это действительно для тебя так важно?
 

Фанат

oncle terrible
Команда форума
да. важно
я не люблю всяких прокси-чекеров.
потому что честному человеку прокси не нужны. а нужны они только для всяких гадостей.
 

Bambino

Новичок
ну почему же? например, я читаю много постов от наших русскоязычных людей, живущих в той или иной стране и желающих что-то скачать из рунета, о том, что они не могут этого сделать, так как их зарубежные IP-адреса блокируются российскими провайдерами... и именно для этого они используют русские прокси-серверы. И дело, даже не в чекере... это был просто пример... я когда-то писал под виндой человеку программку, которая по заданному списку специализированных сайтов искала определенные комплектующие.. результаты складывала в некий HTML-файл... метапоисковый сервер...

P.S. Ну так можно надеяться на помощь? ;) или я уже записан в блэклист?
 

Фанат

oncle terrible
Команда форума
я смотрю, ты большой любитель рот разинуть на чужое.
а все эти слезливые истории про несчастных зарубежных юзеров - только сказки.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху