簡體   English   中英

如何使用php將原始數據發送到IP

[英]How to send raw data to an IP utilizing php

我試圖用PHP腳本將原始數據發送到嵌入式設備(基於WizFi wlan模塊的Wifi Shield在Arduino Leonardo上)。 我可以通過執行以下操作將數據成功發送到設備:

echo -n "teststring" | nc xx.xx.xx.xx 4000 unix終端上的echo -n "teststring" | nc xx.xx.xx.xx 4000 (Mac OS X)(x代表設備ip的占位符)

或使用Putty(在Windows XP下)使用ip,port並選擇“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命令的相應協議(參數的最后一個整數)是:(我從服務器的/ etc / protocols復制的列表(Synology NAS))。

<!-- 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。

我使用php phpscriptinshell.php從shell運行這些示例,因為我遇到了使用SOCK_RAW選項的麻煩,因為我不允許在基於Web的php腳本上運行命令。

最后我得到了錯誤輸出:

套接字連接似乎成功!嘗試發送dataPHP警告:socket_write():無法寫入套接字[22]:第37行/volume2/web/phpscriptinshell.php中的參數無效

警告:socket_write():無法寫入socket [22]:第37行的/volume2/web/phpscriptinshell.php中的參數無效ficus> php phpscriptinshell.php

當我使用協議的其他選項時。 例如1對於ICMP我沒有錯誤但也沒有數據被傳輸。 當我使用0作為IP時,我得到“無法建立套接字:[93]不支持協議”我使用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);
}

抱歉,我不太熟悉格式,所以請道歉。 感謝上次讓我的帖子看起來很棒的那個!

你要:

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

SOCK_RAW適用於需要訪問數據包標頭或某些低級協議(如ICMP)的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM