php socket connect timeout

brianlmoon / socket_connect_timeout.php

This comment has been minimized.

Copy link Quote reply

rotexdegba commented Mar 12, 2015

Thanks for making this code public.

This comment has been minimized.

Copy link Quote reply

brianlmoon commented Apr 3, 2015

@rotexdegba thanks for pointing those out. I extracted this from a lib to make it something I could share and messed up some variables. I will get them fixed.

This comment has been minimized.

Copy link Quote reply

brianlmoon commented Apr 7, 2015

Updated the script with typos fixed. I never have a timeout over 1000ms, so I did not hit that part of the if. Sorry about that.

This comment has been minimized.

Copy link Quote reply

frostover commented Apr 19, 2016

Running on PHP Version 5.6.8

Also checked some of the PHP config values and the default_socket_timeout is even set to 60 so I’m not sure how it’s staying alive for 75 seconds anyways? Any advice?

This comment has been minimized.

Copy link Quote reply

zhuzhichao commented Mar 28, 2019 •

@frostover default_socket_timeout meaning ‘sending or receiving data’ timeout, not ‘connect timeout’.

You can’t perform that action at this time.

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.

Источник

Having problems adding a timeout to socket_connect()

I’m sorry if this has been asked before. I’ve looked everywhere but can’t find any solution to my issue.

I have written a socket client function for a project of mine, and I would like to add a timeout to it so it doesn’t take forever to load if it failed.

I’ve tried quite a few things suggested by the docs and other answers on StackOverflow, but nothing has worked thus far.

I’ve tried the following things;

The only thing that seems to work is the socket_set_nonblock() function, but it always make socket_connect() return false. I just can’t figure it out. Any help would be appreciated.

2 Answers 2

What you could do is a while loop.

You could even get the current «socket_last_error» command in the while loop. http://www.php.net/manual/en/function.socket-last-error.php

Then, before the time check IF statement, you could get the error. If the error is 114 OR 115, it should do the time check error, otherwise you can kill it instantly with the error type. For example, 100: network is down.

I’m not experienced with PHP, but I’ve written enough non-blocking code on C/Perl level. It looks like PHP does not have an easy way (like with Perl) to do what you want, so you have to code everything yourself like in C. From the linux manual page of connect(2):

translated to PHP this would be:

There are various examples out there which do work but do not use socket_select. They either sleep/usleep with a fixed time (and thus need more time to finish connect) or do a busy loop (and just burn CPU time, which might affect other applications).

Источник

socket_connect

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

socket_connect — Начинает соединение с сокетом

Описание

Список параметров

Возвращаемые значения

Список изменений

ВерсияОписание
8.0.0socket теперь экземпляр класса Socket ; ранее был ресурсом ( resource ).
8.0.0port теперь допускает значение null.

Смотрите также

User Contributed Notes 14 notes

man page for connect :
EINPROGRESS
The socket is non-blocking and the connection cannot be completed immediately. It is possible to select(2) or poll(2) for completion by selecting the socket for writing. After select indicates writability, use getsockopt(2) to read the SO_ERROR option at level SOL_SOCKET to determine whether connect completed successfully (SO_ERROR is zero) or unsuccessfully (SO_ERROR is one of the usual error codes listed here, explaining the reason for the failure).

However, I don’t know how does that works under Windows, maybe it wont work at all. It is supposed to work under Linux (man pages said that).

This will print the banner from a true ‘telnet’ server (router, switch, host, etc).

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, ‘127.0.0.1’, 23);

For the TCP connections: socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
In case you’re having problems in socket_connect() with socket_strerror() = «Permission denied», you may be having a SELinux config issue.

That’s it. I read you had to reboot, but I didn’t and it worked fine anyway. More info, you may check:
http://arkiv.netbsd.se/?ml=squirrelmail-users&a=2005-11&t=1523021

Here is an example of a non-blocking connect which should perform quite a bit faster than the one posted by Seymour below:

Источник

Как настроить тайм-аут подключения сокета

когда клиент пытается подключиться к отключенному IP-адресу, существует длительный тайм-аут более 15 секунд. Как мы можем уменьшить этот таймаут? Каков способ его настройки?

код, который я использую для настройки подключения сокета, выглядит следующим образом:

10 ответов:

Я не программирую на C#, но в C мы решаем ту же проблему, делая сокет неблокирующим, а затем помещая fd в цикл select/poll со значением тайм-аута, равным количеству времени, которое мы готовы ждать успешного подключения.

нашел этой для Visual C++ и объяснение там также склоняется к механизму выбора / опроса, который я объяснил ранее.

по моему опыту, вы не можете изменить значения времени ожидания подключения в розетку. Изменения это для всех (путем настройки параметров ОС).

Я решил проблему с помощью сокетов.Метод ConnectAsync вместо сокета.метод Connect. После вызова сокета.ConnectAsync (SocketAsyncEventArgs), запустите таймер (timer_connection), если время истекло, проверьте, подключено ли соединение сокета(if (m_clientSocket.Подключен)), если нет, всплывает ошибка тайм-аута.

проверьте это на MSDN. Не похоже, что вы можете сделать это с помощью реализованных свойств в классе сокета.

Плакат на MSDN на самом деле решил свою проблему С помощью резьбы. У него был основной поток, который вызывал другие потоки, которые запускали код соединения в течение нескольких секунд, а затем проверяли свойство Connected сокета:

Что вы пытаетесь сделать, и почему он не может ждать 15-30 секунд, прежде чем тайм-аут?

Я работал с Unity и имел некоторые проблемы с BeginConnect и другими асинхронными методами из сокета.

есть что-то, чем я не понимаю, но примеры кода, пока не работает для меня.

поэтому я написал этот кусок кода, чтобы заставить его работать. Я тестирую его в сети adhoc с android и ПК, а также в локальном на моем компьютере. Надеюсь, это поможет.

и там очень простой сторожевой пес на C#, чтобы заставить его работать:

Это похоже на ответ FlappySock, но я добавил к нему обратный вызов, потому что мне не понравился макет и как возвращалось логическое значение. В комментариях к этому ответу от Ника Миллера:

Источник

Делаем вебсокеты на PHP с нуля

Некоторое время назад я выбирал библиотеку для работы с вебсокетами. На просторах интернета я натыкался на статьи по интеграции node.js с yii, а почти все статьи о вебсокетах на хабре ограничивались инструкциями к тому, как использовать phpdaemon.

Я изучал библиотеки phpdaemon и ratchet, они достаточно монструозны (причём используя ratchet для отправки сообщения конкретному пользователю рекомендовано дополнительно использовать wamp). Мне не совсем было понятно для чего использовать таких монстров, которые требуют установку других монстров. Почитав исходники этих, а также других библиотек, я разобрался как всё устроено и мне захотелось написать простой вебсокет-сервер на php самостоятельно. Это помогло мне закрепить изученный материал и наткнуться на некоторые подводные камни, о которых я не имел представления.

Так я решил написать необходимый для меня функционал с нуля.

Получившийся код и ссылка на демонстрационный чат в конце статьи.

Поставленные цели:

1) разобраться с серверными сокетами в php
2) разобраться с протоколом вебсокетов
3) написать с нуля простой сервер вебсокетов

1) Серверные сокеты в php

До этого момента я имел смутные представления о серверных сокетах. Почитав исходники нескольких библиотек для работы с вебсокетами я столкнулся с двумя схемами их реализаций:

используя расширение php «socket»:

или используя расширение php «stream»:

Я предпочёл второй вариант ввиду его краткости.

Итак, мы создали серверный сокет и теперь хотим обрабатывать новые соединения к нему, для этого опять же есть два варианта

или с использованием stream_select

Т.к. нам в дальнейшем нужно будет одновременно обрабатывать и серверный сокет на предмет новых соединений, и уже существующие подключения, на предмет новых сообщений, то остановимся на втором варианте.

2) Протокол вебсокетов

«Рукопожатие» или handshake:

Считываем значение Sec-WebSocket-Key из пришедшего заголовка от клиента, рассчитываем на его основе Sec-WebSocket-Accept и отправляем итоговый ответ:

обмен сообщениями

Простой сервер вебсокетов

Итак, у нас есть вся необходимая информация.
Используя код простого http сервера из первой части, а также функции handshake, decode и encode из второй мы можем собрать простой сервер вебсокетов.

В приведённом примере можно менять пользовательские сценарии onOpen, onClose и onMessage для реализации необходимого функционала.

Поставленные цели достигнуты.
Если этот материал вам покажется интересным, то в следующей статье я опишу как можно запускать несколько процессов для обработки соединений (один мастер и несколько воркеров), межпроцессное взаимодействие, интеграцию с вашим фреймворком на примере компонента yii.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *