Вопрос: Правильное использование socket_select ()


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

У меня есть связь с сервер  который позволяет как TCP, так и UDP-пакетные соединения, я использую оба. В этих соединениях я отправляю и получаю пакеты на одном и том же порту, но пакет TCP будет отправлен на один порт ( 29999), а UDP будет отправлен на другой порт ( 30000). Тип передачи будет соответствовать типу передачи AF_INET, IP-адрес будет loopback 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?
}

4


источник


Ответы:


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

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

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

НТН

C.


1