簡體   English   中英

PHP如何與套接字連接並讀取響應?

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

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