我正在使用PHP服务器来管理由计算机和设备组成的平台。
但新的(设备)尚未在MAC层之上实现协议层。 最终,我将使用自定义格式与之通信。这里是 : MAC头 - 46个原始数据 - MAC CRC
我认为socket是个好主意,但我不明白怎么回事? 这是我的功能:
<?php
function request_data($str)
{
$create=socket_create(AF_INET,SOCK_RAW,1);
$send=socket_send($create,$str,strlen($str),0);
socket_close($create);
}
?>
你能帮帮我吗?
答案 0 :(得分:0)
AF_INET已经声明这是使用IP协议,因此您不能使用MAC协议字段。 您的以太网设备可能已经有一个库来发送原始数据包,您需要使用它。如果它没有,你将无法从PHP发送原始数据包
答案 1 :(得分:0)
感谢所有的解释。
确实,我寻找另一种解决方案,我找到了一种无需协议发送/接收某些帧的方法: 在c / c ++中,一个名为“libpcap”的库已经被设计用于这种东西。 使用“swig”,可以提取一些函数(使用接口文件进行调整)并生成php扩展(* .so)。 在网络上查找“marcelog”。他发表了一篇文章,其中有一个例子。 我几乎验证了我的配置解决方案:在Ubuntu 14.04 64位上使用php5的apache2。
但是,我有一个最后的“linux”许可问题。 我不能做以下命令之王
$ php -c php.ini inject.php eth0 "" 4096 10000 myRawPacketData.raw
- php.ini包含链接在哪里是扩展名, - inject.php包含使用libpcap函数的脚本 - eth0(参数1)是我计算机上的界面 - “”(参数2)是一个过滤器 - 4096(参数3)是长度 - 10000(参数4)是超时 - myRawPacketData.raw(参数5)包含要发送的数据
我有以下错误:
what():无法打开设备:eth0:eth0:您无权在该设备上捕获(套接字:不允许操作)放弃 (核心倾销)
但是可以做到:
$ **sudo** php -c php.ini inject.php eth0 "" 4096 10000 myRawPacketData.raw
它在我的界面上发送一个帧(由wireshark确认)。 有关信息,我执行了此命令,因为wires0中没有eth0:
sudo chmod 4711 'sudo which dumpcap'
你可以帮助我在不使用sudo命令的情况下auth apache2(或wwww-data)访问eth0,因为目前我不能在控制台外使用inject.php脚本(这不是我的目标)?