Один из разработчиков сегодня пожаловался, что у него есть два скрипта, цепляющихся по API к одному и тому же серверу, так один работает, а второй вообще соединиться не может. Разница в функциях: в одном используется fsockopen, а в другом socket_connect.
Причём когда он их цепляет не к тому серверу, а к своему тестовому (на его же ноутбуке в докер-контейнере), то оба нормально работают. Вот и решил у меня поинтересоваться, нет ли каких проблем в сетевых соединениях к серверу, или каких затыков в файрволах..
Хотя вроде бы кажется, что если один скрипт успешно подключается, значит, проблем в сети нет. Но.. случаи же разные бывают. Может, где-то есть ограничение на количество соединений с одного клиентского адреса, или у самого сервера ограниченное количество соединений, или ещё что.. Так что первым делом я попросил его посоединяться туда telnet’ом. Он попробовал, нормально получается.
Значит, что-то не так в самом скрипте. Попросил показать мне кусок кода, который осуществляет это соединение. А там вместо двух строчек (создать сокет и подцепить его к серверу socket_connect‘ом) внезапно оказалсь целая страница.. И не просто функция, а целый класс, который умеет соединяться и по IPv4, и по IPv6, и после запуска соединения несколько секунд в цикле проверяет ошибки сокета, пока не убедится, что соединение нормально установилось, или пока счётчик не кончится. И если не получилось, будет попробовать следующий сервер, если их в списке больше одного.
Оказалось, что это он не сам написал, а скачал из интернетов готовую реализацию того API, стал её проверять, а вот она с сервером не соединяется.
Ну я этот кусок кода скопировал, выкинул оттуда все внутриклассовые ссылки, вписал параметры конкретного сервера, запустил - и он нормально соединился. И тут… разработчик сообщил, что у него тоже заработало!
Что, эффект присутствия?! Ну, в каком-то смысле да. Ибо, когда я попросил прислать этот кусок кода, он его не просто прислал, а ещё и сам почитал, и нашёл, в чем была засада.
Мораль: показывая кому-то программу, а особенно, рассказывая, как она работает, сам гораздо лучше начинаешь это понимать. Заодно и ошибки можешь найти и исправить. Ну и кто уже догадался, что было не так в этой программе??
Сокету по умолчанию выставлялся таймаут в 750ms, и мне их хватало, а от того ноутбука до сервера было гораздо дольше, и соединение не успевало установиться. Естественно, всё починилось увеличением этого таймаута.
Оригинал этой записи в личном блоге.
(
| Комментировать
в Dreamwidth)