【问题标题】:Use PHP socket to send and receive data使用 PHP 套接字发送和接收数据
【发布时间】:2012-02-16 13:54:03
【问题描述】:

我正在尝试通过 PHP 套接字发送和接收数据。

一切正常,但是当我尝试发送数据时,PHP 没有发送任何内容(Wireshark 告诉我发送的数据长度为 0)。

我正在使用此代码:

<?php
$address = 'example.com';
$port = 1234;

$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$sockconnect = socket_connect($sock, $address, $port);

$c = 0;
do {
    $c++;
    $msg = '<test>Xml data</test>';

    socket_write($sock, $msg, strlen($msg));

    echo socket_read($sock, 1024 * 100, PHP_NORMAL_READ);

} while ($c < 3);

socket_close($sock);

谁能帮帮我? 感谢您阅读我的问题。

【问题讨论】:

    标签: php sockets


    【解决方案1】:

    如果您一次都不检查错误,您怎么知道一切正常?

    考虑以下example from the manual

    <?php
    error_reporting(E_ALL);
    
    /* Get the port for the WWW service. */
    $service_port = getservbyname('www', 'tcp');
    
    /* Get the IP address for the target host. */
    $address = gethostbyname('www.example.com');
    
    /* Create a TCP/IP socket. */
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    if ($socket === false) {
        echo "socket_create() failed: reason: " . 
             socket_strerror(socket_last_error()) . "\n";
    }
    
    echo "Attempting to connect to '$address' on port '$service_port'...";
    $result = socket_connect($socket, $address, $service_port);
    if ($result === false) {
        echo "socket_connect() failed.\nReason: ($result) " . 
              socket_strerror(socket_last_error($socket)) . "\n";
    }
    
    $in = "HEAD / HTTP/1.1\r\n";
    $in .= "Host: www.example.com\r\n";
    $in .= "Connection: Close\r\n\r\n";
    $out = '';
    
    echo "Sending HTTP HEAD request...";
    socket_write($socket, $in, strlen($in));
    echo "OK.\n";
    
    echo "Reading response:\n\n";
    while ($out = socket_read($socket, 2048)) {
        echo $out;
    }
    
    socket_close($socket);
    ?>
    

    【讨论】:

    • 没有任何错误,但远程主机不再回复我。但是当我通过 SocketTest v3.0 发送数据时它可以正常工作
    • 是的,它适用于其他主机,但我只需要发送 xml 数据,因为我的主机不响应来自除 1980 之外的任何端口的 http 头请求。它不响应我(即使使用您的示例) 当我发送 XML 数据时。
    • 嗯,这不是 PHP 的问题。
    • 但是 SocketTest(用 java 编写)在使用相同的操作系统、相同的数据、相同的主机时可以正常工作。我将 PHP 发送的数据与 SocketTest (wireshark) 发送的数据进行了比较,所有发送的包都是相同的。
    【解决方案2】:

    你没有使用 gethostbyname 函数,所以它会尝试连接到一个不存在的 IP 地址

    <?php
    $address= gethostbyname('yourdata.com');
    

    【讨论】:

      猜你喜欢
      • 2013-06-18
      • 2013-11-13
      • 2017-07-13
      • 2012-02-12
      • 2016-12-16
      • 2013-07-04
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      相关资源
      最近更新 更多