2009-03-29 20 views
0

Der Code:Warum funktioniert TCP, wenn UDP nicht?

<?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); 
?> 

Es arbeitet mit TCP:

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

aber mit UDP arbeitet es nicht:

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

Die Fehler:

Warnung: socket_listen() [Funktion.Socket-Liste n]: Socket [0] kann nicht abgehört werden: Die versuchte Operation wird für den Typ des referenzierten Objekts nicht unterstützt. in C: \ wamp \ www \ socket \ socket.php in Zeile 22 socket_listen() fehlgeschlagen: Grund: Der versuchte Vorgang wird für den Typ des referenzierten Objekts nicht unterstützt.

Warnung: socket_accept() [function.socket-accept]: eingehende Verbindung nicht annehmen [0]: Die versuchte Operation wird für den referenzierten Objekttyp nicht unterstützt. in C: \ wamp \ www \ socket \ socket.php in Zeile 27 socket_accept() fehlgeschlagen: Grund: Der versuchte Vorgang wird für den Typ des referenzierten Objekts nicht unterstützt.

Antwort

4

Da TCP ist verbindungsorientiert und UDP ist nicht, und es gibt verschiedene APIs für UDP-Sockets. Schauen Sie sich socket_recvfrom und socket_sendto an.

0

Ich habe es aus

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

zu

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