gpt4 book ai didi

php - 如何使用 php 将原始数据发送到 IP

转载 作者:搜寻专家 更新时间:2023-10-31 21:14:37 26 4
gpt4 key购买 nike

我正在尝试使用 php 脚本将原始数据发送到嵌入式设备(基于安装在 Arduino Leonardo 上的 WizFi wlan 模块的 Wifi Shield)。我可以通过执行以下操作成功地将数据发送到设备:

echo -n "teststring"| nc xx.xx.xx.xx 4000 在 unix 终端 (Mac OS X) 上(x 代表设备 ip 的占位符)

或者 使用带有 ip、端口的 Putty(在 Windows XP 下)并选择“RAW”作为连接类型。

为了达到同样的目的,我尝试在 php 脚本中建立一个套接字(因为我想通过 Web 表单向设备发送数据)。

查看下面的示例代码:

$mysocket = socket_create(AF_INET, SOCK_RAW,255);  

if ($mysocket === false) {
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("could not establish socket: [$errorcode] $errormsg");
}

// connect to socket
if (socket_connect($mysocket, 'xx.xx.xx.xx', 4000)) {
$text = "Socket connection seems successful!";
} else {
$text = "Unable to connect<pre>".socket_strerror(socket_last_error())."</pre>";
}

echo $text;

echo "Mystring: ";
echo $mystring;

echo "try to send data";


// send string to server
socket_write($mysocket, $mystring, strlen($mystring)) or die("Could not send data");
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);

echo "errorcode:";
echo $errorcode;
echo $errormsg;

socket_close($mysocket);

套接字创建命令(参数的最后一个整数)的相应协议(protocol)是:(我从服务器 (Synology NAS) 的/etc/protocols 复制的列表。

<!-- language: none -->
ip 0 IP
icmp 1 ICMP
igmp 2 IGMP
ggp 3 GGP
tcp 6 TCP
pup 12 PUP
udp 17 UDP
idp 22 IDP
raw 255 RAW

在这个例子中,我使用了 RAW。

我使用以下命令从 shell 运行这些示例php phpscriptinshell.php因为我在使用 SOCK_RAW 选项时遇到了麻烦,因为不允许我通过基于 Web 的 php 脚本运行命令。

所以最后我得到了错误输出:

Socket 连接似乎成功!尝试发送数据PHP 警告:socket_write():无法写入 socket [22]:第 37 行/volume2/web/phpscriptinshell.php 中的参数无效

警告:socket_write():无法写入套接字 [22]:第 37 行/volume2/web/phpscriptinshell.php 中的参数无效榕树> php phpscriptinshell.php

当我为协议(protocol)使用其他选项时。例如1 对于 ICMP 我没有收到任何错误,但也没有数据传输。当我为 IP 使用 0 时,我得到“无法建立套接字:[93] 协议(protocol)不受支持”如果我将 6 用于 TCP,则终端变得无响应并且 wifi 芯片失去与网络的连接。

所以我的问题是:

1) 为什么我尝试写入套接字时得到“无效参数”?

2) 当使用 TCP 作为协议(protocol)参数时会发生什么?

3) 使用 php 发送数据的正确方法应该是什么?

4) 你对解决这个问题有什么建议?

非常感谢您的提示!

作为继 Barmers Hint 之后的第二次尝试,我尝试了相同的脚本但替换了

$mysocket = socket_create(AF_INET, SOCK_RAW,255);

通过

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

再次与

$mysocket = socket_create(AF_INET, SOCK_STREAM,6);

按照我用作第二个脚本的第二个提示:

$socket = stream_socket_server("tcp://62.32.29.210:4000", $errno, $errstr);

if (!$socket) {
echo "$errstr ($errno)<br />\n";

} else {
while ($conn = stream_socket_accept($socket)) {
fwrite($conn, 'The local time is ' . date('n/j/Y g:i a') . "\n");

fclose($conn);
}
fclose($socket);
}

抱歉,我不太熟悉格式,所以请见谅。还要感谢上次让我的帖子看起来不错的那个!

最佳答案

你想要:

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

SOCK_RAW 适用于需要访问数据包 header 或某些低级协议(protocol)(如 ICMP)的情况。

关于php - 如何使用 php 将原始数据发送到 IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11757855/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com