Почему TCP работает, а UDP нет? - PullRequest
1 голос
/ 30 марта 2009

код:

<?php
error_reporting(E_ALL);

/* Allow the script to hang around waiting for connections. */
set_time_limit(0);

/* Turn on implicit output flushing so we see what we're getting
 * as it comes in. */
ob_implicit_flush();

$address = '127.0.0.1';
$port = 11100;

if (($sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UP)) === false) {
    echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
}

if (socket_bind($sock, $address, $port) === false) {
    echo "socket_bind() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
}

if (socket_listen($sock, 5) === false) {
    echo "socket_listen() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
}

do {
    if (($msgsock = socket_accept($sock)) === false) {
        echo "socket_accept() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
        break;
    }
    do {
    $out = socket_read($msgsock, 2048);

    if (!empty($out)) {
        if ($out == 'quit') {
            break;
        }
        elseif ($out == 'shutdown') {
            socket_write($msgsock, 'plc down', 8);
            socket_close($msgsock);
            break 2;
        }
        else {
            switch ($out) {
                case "KABBE": $response = "Kabbe te!"; break;
                case "SZOPJ": $response = "Szopjal te!"; break;
                default: $response = "Ismeretlen parancs";
            }
            socket_write($msgsock, $response, strlen($response));
            break;
        }
    }
    } while (true);
socket_close($msgsock);
} while (true);

socket_close($sock);
?>

Работает с TCP:

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

но с UDP это не работает:

$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);

Ошибки:

Предупреждение: socket_listen () [function.socket-listen]: невозможно прослушать сокет [0]: Попытка операции не поддерживается для типа объекта, на который ссылаются. в C: \ wamp \ www \ socket \ socket.php в строке 22 socket_listen () не удалось: причина: попытка операции не поддерживается для указанного типа объекта.

Предупреждение: socket_accept () [function.socket-accept]: невозможно принять входящее соединение [0]: предпринятая операция не поддерживается для указанного типа объекта. в C: \ wamp \ www \ socket \ socket.php в строке 27 socket_accept () не удалось: причина: попытка операции не поддерживается для типа объекта, на который ссылаются.

Ответы [ 2 ]

5 голосов
/ 30 марта 2009

Поскольку TCP ориентирован на соединение, а UDP - нет, и существуют разные API для сокетов UDP. Посмотрите socket_recvfrom и socket_sendto .

0 голосов
/ 05 января 2013

Я исправил это, отредактировав класс Growl из

 socket_sendto($sck, $data, strlen($data), 0x100, $this->address, $this->port);

до

 socket_sendto($sck, $data, strlen($data), 0x0, $this->address, $this->port);
...