socket_recv我想要可读数据而不是字节数

时间:2013-06-04 20:26:04

标签: php xml sockets human-readable

大家好,如果已经被问到,那么你们不要用虚拟枪射击我,但是,这里有。

我是一个ip / port的socket_send我看到服务器收到并回复数据。我的代码收到xxxx字节。我想知道那些字节需要IE:xml字符串返回所以我可以在我的应用程序中解析并使用数据。在这种情况下,cURL不可行,因为服务器接收标头但根本没有响应。

**Code:**
/* 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";
} else {
echo "OK.\n";
}

/* 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";
} else {
echo "OK.\n";
}

echo "Attempting to connect to '$address' on port '$port'...";
$result = socket_connect($socket, $address, $port);
if ($result === false) {
echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
} else {
echo "OK.\n";
}

$in = $xml;
$out = '';

echo "Sending HTTP HEAD request...";
socket_write($socket, $in, strlen($in));
echo "OK.\n";
socket_shutdown($socket, 1);
echo "Reading response:\n\n";
$buf = '';
if (false !== ($bytes = socket_recv($socket, $buf, 2048, MSG_WAITALL))) {
echo "Read $bytes bytes from socket_recv(). Closing socket...";
} else {
echo "socket_recv() failed; reason: " . socket_strerror(socket_last_error($socket)) . "\n";
}
socket_close($socket);

echo $buf . "\n";
echo "OK.\n\n";
?>

响应:

TCP / IP连接 好。好。尝试在端口'9000'上连接到'xxx.xxx.xxx.xxx'...确定。发送HTTP HEAD请求...确定。读取响应:从socket_recv()读取1365个字节。关闭插座......好的。

2 个答案:

答案 0 :(得分:0)

首先,你可以使用cURL而不是发送标题!只是一个假。

其次,确切地确定它是什么类型的内容会很棘手......服务器是否返回任何类型的“内容类型”?如果是这样,您可以阅读。

然后,您可以使用$ buf,然后尝试使用XML库来解析字符串(例如PHP的SimpleXML库)。

例如,如果它不解析XML,那么您知道它是常规字符串或其他内容。

cURL应该返回内容类型。

答案 1 :(得分:0)

在疯狂的头痛和几次药物命中之后我发现了这个问题:1行OMG

如果有任何其他人在socket_close($ socket)之后的socket中遇到这个问题;我添加了echo html_entity_decode($ buf);