【问题标题】:How to send raw data to an IP utilizing php如何使用php将原始数据发送到IP
【发布时间】:2012-08-01 11:01:13
【问题描述】:

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

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

或 使用 Putty(在 Windows XP 下)和 ip、端口并选择“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);                                                     

socket create 命令的对应协议(参数的最后一个整数)是: (我从服务器(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 从 shell 运行这些示例 php phpscriptinshell.php 因为我在使用 SOCK_RAW 选项时遇到了麻烦,因为不允许我通过基于 Web 的 php 脚本运行命令。

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

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

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

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

所以我的问题是:

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

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

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

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

【问题讨论】:

    标签: php sockets


    【解决方案1】:

    你想要:

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

    SOCK_RAW 用于当您需要访问数据包头或一些低级协议(如 ICMP)时。

    【讨论】:

    • 我个人更喜欢fsockopen('tcp://xx.xx.xx.xx', 4000);,因为它更容易使用适当的流资源,而且fsockopen() 比套接字扩展更容易获得。
    • $mysocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);我收到警告:socket_connect(): 无法连接 [110]: Connection timed out in /volume2/web/testphpshell.php on line 27 Unable to connect
      Connection timed out
      Mystring: try to send dataPHP Warning :socket_sendto():无法写入套接字[32]:第46行/volume2/web/testphpshell.php中的管道损坏警告:socket_sendto():无法写入套接字[32]:/volume2/web中的管道损坏/testphpshell.php 第 46 行 socket 的结果发送到:errorcode:Broken pipe
    • 对于您的第二个提示,我从一个我发现使用 fsockopen 的示例中设置了一个简单的脚本。这导致我:#!/usr/bin/php PHP 警告:stream_socket_server():无法连接到 /volume2/web/testphpshell2 中的 tcp://xx.xx.xx.xx:4000(无法分配请求的地址)第 5 行的 .php 警告:stream_socket_server():无法连接到第 5 行 /volume2/web/testphpshell2.php 中的 tcp://xx.xx.xx.xx:4000(无法分配请求的地址) 无法分配请求的地址(0)
      我的原因在这里替换了真实IP。对我来说,当我使用 TCP 时,我似乎需要发送一个正确的 TCP 包。
    猜你喜欢
    • 2021-06-05
    • 2012-10-17
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多