【问题标题】:How can I send data with PHP to an IP address via UDP?如何使用 PHP 将数据通过 UDP 发送到 IP 地址?
【发布时间】:2010-10-15 19:46:49
【问题描述】:

如何使用 PHP 将数据通过 UDP 发送到 IP 地址?

如何在另一台计算机上接收该数据?

<?php
$fp = pfsockopen( "udp://192.168.1.6", 9601, $errno, $errstr );

if (!$fp)
{
    echo "ERROR: $errno - $errstr<br />\n";
}
socket_set_timeout ($fp, 10);

$write = fwrite( $fp, "kik" );
//$data .= fread($fp,9600);
//echo "$data<br>";
fclose($fp);
echo "<br>Connection closed ..<br>";

if (!$write) {
    echo "error writing to port: 9600.<br/>";
    next;
?>

此代码发送带有程序的“kik”,我可以在另一台计算机上读取它,但我如何在浏览器中看到它?

【问题讨论】:

  • Viktor,请将您的第二个问题重新发布为另一个问题。

标签: php udp sockets


【解决方案1】:

我的 PHP 知识有点生疏,所以我一直在做一些搜索,试图找到一些好的指南和教程。这个PHP Sockets Made Easy看起来对你来说是一个很好的入门指南。

编辑:我发布的原始文章没有详细介绍 UDP,因此我删除了前面的代码。来自PHP Manual 的文章有一些专门关于 UDP 的更多信息:

<?php
$socket = stream_socket_server("udp://127.0.0.1:1113", $errno, $errstr, STREAM_SERVER_BIND);
if (!$socket) {
    die("$errstr ($errno)");
}

do {
    $pkt = stream_socket_recvfrom($socket, 1, 0, $peer);
    echo "$peer\n";
    stream_socket_sendto($socket, date("D M j H:i:s Y\r\n"), 0, $peer);
} while ($pkt !== false);

?>

编辑#2:这是另一个useful tutorial,用于 PHP 中的套接字编程。它主要是 TCP,但它确实包含有关如何更改代码以改用 UDP 的部分。

【讨论】:

  • 亚当戴维斯:谢谢。我会继续做更多的观察。我知道上面的文章谈到了一些关于 UDP 的内容。
  • 噢,这是一个比我更好的答案。我现在既嫉妒又生气。
【解决方案2】:

刚刚从我的一些工作代码中提取了这个 sn-p



if (!socket_bind($sh, LISTENIP, LISTENPORT)) exit("Could not bind to socket");

while (TRUE) {
    // $z = socket_recvfrom($sh, $data, 65535, 0, $connectip, $connectPort);
    while(socket_recvfrom($sh, $data, 65535, 0, $connectip, $connectPort)) {
        $pid = pcntl_fork();
        if ($pid == -1) {
            die('could not fork');
        } else { #START ELSE COULD FORK
            $PIDS[$pid] = $pid; //KEEP TRACK OF SPAWNED PIDS
            if ($pid) {
                //PARENT THREAD : $ch is a copy that we don't need in this thread
            } else {
                /** CHILD THREAD::BEGIN PROCESSING THE CONNECTION HERE!    **/
                include "include/child_thread.inc.php";
            } //Child Thread
        }//if-else-forked

        /** CLEANUP THE CHILD PIDs HERE :: "Any system resources used by the child are freed." **/
        foreach ($PIDS as $pid) pcntl_waitpid($pid,$status,WNOHANG);

        $i++; //INCREASE CONNECTION COUNTER
    }//While socket_accept


    /** CLEANUP THE PARENT PIDS **/
    foreach ($PIDS as $pid) {
        $returnPid = pcntl_waitpid($pid,$status);
        unset($PIDS[$pid]);
    }
}//While True

【讨论】:

  • 哎呀,忘记包含发送部分(这是简单的部分)socket_sendto($sh,$packet,strlen($packet), 0x100,$connectip,$dest_port)
【解决方案3】:

我想你会发现PHP's socket reference 是学习这个主题的好地方。

【讨论】:

    【解决方案4】:
    <?php
    $server_ip   = '127.0.0.1';
    $server_port = 43278;
    $beat_period = 5;
    $message     = 'PyHB';
    print "Sending heartbeat to IP $server_ip, port $server_port\n";
    print "press Ctrl-C to stop\n";
    if ($socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP)) {
      while (1) {
        socket_sendto($socket, $message, strlen($message), 0, $server_ip, $server_port);
        print "Time: " . date("%r") . "\n";
        sleep($beat_period);
      }
    } else {
      print("can't create socket\n");
    }
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-06
      • 1970-01-01
      • 2012-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-08
      相关资源
      最近更新 更多