[英]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.