如何使用不带协议的Php发送以太网帧(IP / UDP / TCP ...)

时间:2015-02-20 12:21:34

标签: php

我正在使用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);
}
?>

你能帮帮我吗?

2 个答案:

答案 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脚本(这不是我的目标)?