[英]PHP how to connect with sockets and read the response?
標題說明了一切...
如何使用tcp協議連接到IP並讀取/獲取響應? 我已經搜索了很多,但沒有找到任何解決方案。
$socket = stream_socket_server("tcp://127.0.0.1:22", $errno, $errstr);
if (!$socket) {
echo "$errstr ($errno)<br />\n";
} else {
while ($conn = stream_socket_accept($socket)) {
echo fread($conn, 26);
fclose($conn);
}
fclose($socket);
}
這個代碼可以嗎? 有工作嗎? 因為似乎沒用...
提前致謝
如其他人所建議; 避免使用端口22。我建議使用> 1024的晦澀(未使用)的套接字端口號,例如4444。低於1024的任何端口通常都需要root訪問權限。 如果您需要測試22的連接性,請讓服務器腳本運行其他功能。
至於將響應發送回連接的客戶端,請使用stream_socket_recvfrom($socket, $length, 0, $peer)
而不是fread()
然后在客戶端添加響應偵聽器:
client.php
$socket = stream_socket_client('tcp://127.0.0.1:4444');
if ($socket) {
$sent = stream_socket_sendto($socket, 'message');
if ($sent > 0) {
$server_response = fread($socket, 4096);
echo $server_response;
}
} else {
echo 'Unable to connect to server';
}
stream_socket_shutdown($socket, STREAM_SHUT_RDWR);
server.php
$conn = stream_socket_server('tcp://127.0.0.1:4444');
while ($socket = stream_socket_accept($conn)) {
$pkt = stream_socket_recvfrom($socket, 1500, 0, $peer);
if (false === empty($pkt)) {
stream_socket_sendto($socket, 'Received pkt ' . $pkt, 0, $peer);
}
fclose($socket);
usleep(10000); //100ms delay
}
stream_socket_shutdown($conn, \STREAM_SHUT_RDWR);
運行server.php,它將在無限循環中偵聽非空數據包,一旦server.php接收到數據包,它將使用接收到的數據包響應已連接的客戶端。
然后執行client.php,它將“消息”發送到server.php。一旦發送,它將檢索並回顯server.php的響應,該'Received pkt message'
應顯示為'Received pkt message'
來自http://php.net/stream_socket_accept
接受先前由stream_socket_server()創建的套接字上的連接。
這意味着它等待一個客戶端想要連接。 (您只是將自己綁定到端口,但是什么也不連接)
而且fread也是與socket_ *函數一起使用的錯誤函數。 正確的函數應該是stream_socket_recvfrom()。
但這確實不是您想要的。 您似乎想打開到某個地方的連接。 因此,fsockopen()是正確的函數:
$conn = fsockopen("127.0.0.1", 22, $errno, $errstr);
if (!$conn) {
echo "$errstr ($errno)<br />\n";
} else {
echo fread($conn, 26);
fclose($socket);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.