Правильное использование socket_select () - PullRequest
4 голосов
/ 07 апреля 2010

Как правильно использовать socket_select в PHP для отправки и получения данных?

У меня есть соединение с сервером , которое разрешает как TCP, так и UDP пакетные соединения, я использую оба. В этих соединениях я отправляю и получаю пакеты на один и тот же порт, но TCP-пакет будет отправлен на один порт (29999), а UDP будет отправлен на другой порт (30000). Тип передачи будет AF_INET. IP-адрес будет петлевой 127.0.0.1.

У меня много вопросов о том, как создать сокет-соединение в этом сценарии. Например, лучше ли использовать socket_create_pair для установления соединения или просто использовать socket_create , за которым следует socket_connect , а затем реализовать socket_select

Существует вероятность того, что никакие данные не будут отправлены с сервера на клиент, и клиент должен поддерживать соединение. Это будет сделано с помощью функции времени ожидания в вызове socket_select. Если данные не будут отправлены в течение определенного времени, функция socket_select прекратит работу, и затем будет отправлен пакет поддержки активности. Следующий скрипт клиента.

// Create
$TCP = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$UDP = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);

// Misc
$isAlive = TRUE;
$UDPPort = 30000;
define('ISP_ISI', 1);

// Connect
socket_connect($TCP, '127.0.0.1', 29999);
socket_connect($UDP, '127.0.0.1', $UDPPort);

// Construct Parameters
$recv = array($TCP, $UDP);
$null = NULL;

// Make The Packet to Send.
$packet = pack('CCCxSSxCSa16a16', 44, ISP_ISI, 1, $UDPPort, 0, '!', 0, 'AdminPass', 'SocketSelect');

// Send ISI (InSim Init) Packet
socket_write($TCP, $packet);

/* Main Program Loop */
while ($isAlive == TRUE)
{
    // Socket Select
    $sock = socket_select($recv, $null, $null, 5);

    // Check Status
    if ($sock === FALSE)
        $isAlive = FALSE; # Error
    else if ($sock > 0)
        # How does one check to find what socket changed?
    else
        # Something else happed, don't know what as it's not in the documentation, Could this be our timeout getting tripped?
}

1 Ответ

1 голос
/ 07 апреля 2010

Я немного запутался - вы, похоже, пытаетесь справиться с асинхронными запросами, поступающими через 2 сокета, но оба действуют как клиенты? Это очень необычный сценарий. Пытаться реализовать их, используя разные протоколы (tcp и udp), еще более странно (H323 VOIP - единственное приложение, которое я знаю, которое делает это). Быстрый гугл предполагает, что вы пытаетесь написать клиент для LFS - но зачем вам одновременно работать TCP и UDP клиент? (Кстати, они публикуют подходящий код клиента PHP в своей вики на http://en.lfsmanual.net)

Сокет, в котором есть данные, ожидающие чтения, будет в массиве $ recv после вызова socket_select () (т. Е. Массив обрезается и его необходимо заполнить перед следующей итерацией socket_select ()).

Если socket_select возвращает 0, это просто означает, что сокеты не являются блокирующими, и ни у одного из них нет доступных данных.

НТН

С

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...