Не коннектится. Причём, у многих. Причём, по непонятной причине.
За минувшие несколько дней наслушался разных версий о происходящем, вплоть до того, что это всемирный заговор и все мы умрём. Не могу не вставить свои пять копеек по этому поводу. =)
Прелюдия #1.
Сижу я из дома в тырнете через МегаФон'овский GPRS. На этом самом GPRS'е не так давно меняли точку доступа (APN) с "internet.mcu" на "internet". Сейчас, насколько я понимаю, актуален только второй вариант, но это не суть важно: некоторое время работали оба. Но работали интересно: если на "internet.mcu" аська коннектилась вполне себе нормально безо всяких траблов, то на "internet" она если и коннектится, то попытки эдак с -адцатой. Что само по себе наводит на мысли.
Прелюдия #2.
А ещё этим летом я написал себе небольшого асечного бота на PHP и повесил его висеть на один из серваков РуНета (1991216, если кто не знает). Почему на PHP? Захотелось вот. К тому же, PHP-скрипт теоретически можно запустить на любом серваке, на котором есть PHP. В том числе, и на виртуальном хостинге.
Прелюдия #3.
Нужно ли говорить, что поскольку я занимаюсь сайтостроительством, у мяен есть возможность запустить сей скрипт как минимум на нескольких хостах? =)
Эксперимент.
Сперва пытаемся приконнектится, запустив скрипт на локальной связке Apache+PHP.
1) Открываем сокет на login.icq.com:5190
2) Получаем приветствие ICQ-сервера: SRV_HELLO (он всегда "здоровается" первым).
3) Формируем специальный пакет с информацией о клиенте, UIN и пассе и отсылаем - это называется CLI_IDENT.
4) Пытаемся читать из сокета...
5) Фиг.
6) Ещё пытаемся...
6) Фиг.
7) Повторяем эксперимент, пока не надоест. Я лично до пяти минут держал сокет открытым, и ждал, не пришлёт ли чего сервер в ответ. Не прислал. А должен бы.
Кстати, это же состояние Jimm называет ошибкой 118.0
Повторим эксперимент на другом уровне.
1) Не меняя ни байта в скрипте, загружаем его на первый попавшийся ( ~_^ ) хостинг.
2) Запускаем.
3) Через пяток секунд - успешный логин.
Гипотеза, согласно которой дело в клиенте, постепенно отсыхает и отваливается.
Теперь меняем в локальном скрипте "login.icq.com" на "ibucp-vip-m.blue.aol.com" (подсмотрено у
aidan4). Запускаем, доходим до шага номер пять - и здесь получаем в ответ от сервера... нет, не фиг, а вполне полноценный пакет с CLI_COOKIE и адресом BOS-сервера (это такой сервер, с которым, в основном, и происходит общение у любого асечного клиента. Функция login.icq.com лишь в том, чтобы проверить логин, пасс, и перенаправить клиента на один из таких серверов). Логин удался.
Так в чём же дело? Возможно, в личной неприязни между определёнными IP и определёнными асечными серверами. Ещё слышал гипотезу, что асечные сервера не хотят общаться с народом на "дохлом" коннекте (он же "тормозной", он же "тупой"), напр. - GPRS. =) То есть, общаются, но не всегда - только когда пакеты шустро ходят.
Проверим.
Самым изуверским образом вписал в свой скрипт задержку между fwrite заголовка пакета и fwrite его тела. Иными словами, теперь моя прелесть на любой отсылке FLAP-пакета (а именно так зовутся асечные пакеты) сперва шлёт шестибайтовый заголовок, потом тормозит секунду (что немало) - и шлёт всё остальное. Не ожидал, что после запуска всё заработает - но приконнектиться удалось.
Сему мораль - коннект не виноват, только если не совсем неживой.
Мораль на сегодня.
Пока единственное средство, которое можно присоветовать, если не коннектится аська - опробовать другого провайдера и/или другой адрес/порт логин-сервера. Или завести себе бота, запустить его на серваке и прикрутить транспорт в Jabber. Ну, или просто запастись огроменным запасом терпения. Авось, воздастся.
P.S. За сорцами можно обращаться, если интересует. Распространяться будут по GPL v2 с поправками на кривизну кода. =)