cURL只有IP和端口

时间:2017-01-18 11:07:50

标签: php xml curl

我正在尝试向IP:端口发送XML请求,但cURL总是超时。但是,端点已启动并正在运行。我指的是错误的网址吗?这就是我所拥有的:

$ip = '90.179.113.54';
$port = '5500';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://' . $ip . ':' . $port);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 4);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
$result = curl_exec($ch);

$xml变量只是我发送的XML,所以不要担心。此端口上的服务器应返回XML响应,我想我正在$result中捕获。但是,此连接始终以超时结束 - 当我将IP /端口输入浏览器时,它不会超时。它返回浏览器无法处理的XML响应。

Telnet回复:

telnet 90.179.113.54 5500
Trying 90.179.113.54...
Connected to 54.113.broadband12.iol.cz.
Escape character is '^]'.
telnet 90.179.113.54 5500
Trying 90.179.113.54...
Connected to 54.113.broadband12.iol.cz.
<?xml version="1.0" encoding="Windows-1250" standalone="yes"?>
<RESPONSE TYPE="0" MODUL="" LANG=""><ERROR ERRNUM="0" ERRMESSAGE="0-OK" ATTRIBUT=""/></RESPONSE>

2 个答案:

答案 0 :(得分:0)

此端口未打开,请尝试访问:http://90.179.113.54:5500/

答案 1 :(得分:0)

服务器不会说HTTP,你告诉curl它是一个http url。

因为它不是HTTP服务器,所以不要试图用它说HTTP。这就是你在这里做错了(你告诉curl它是一个HTTP网址,并且curl尝试与服务器说HTTP)。

它似乎只是说TCP / ASCII(或utf-8?)XML,所以试试吧。

$sock=socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
socket_connect($sock,'90.179.113.54',5500);
socket_write($sock,$xml);//???
$read_total='';
while(false!==($read_now=socket_read($sock,999,PHP_BINARY_READ))){
    if(strlen($read_now)<1){
        break;//...
    }
    $read_total.=$read_now;
}
socket_close($sock);
var_dump($read_total);

也要小心,不能保证socket_write实际上在一次调用中发送所有数据(并且几乎可以保证当发送的数据大小不是> = 65535字节时它不会),所以要安全,你应该使用一些write_all函数,如

function socket_write_all($sock, string $data) {
    $len=strlen($data);
    while($len>0){
        $written=socket_write($sock,$data);
        if($written===false){
            throw new RuntimeException('socket_write failed. errno: '.socket_last_error($sock).'. error: '.socket_strerror(socket_last_error($sock)));
        }
        $len-=$written;
        $data=substr($data,$written);
    }
    return;//all data written
}

也要小心,套接字是默认阻塞的(无论如何在linux / windows / mac中),但是如果你明确地将套接字设置为非阻塞模式,上面的send_all函数会使用很多cpu(比如近100%的1核心),并且有办法缓解(select()/ poll()),但为了简单起见,我建议你现在只使用阻塞套接字(并开始考虑非阻塞套接字时)你有一切正常,并从优化阶段开始,如果有的话)