首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >套接字上的feof块

套接字上的feof块
EN

Stack Overflow用户
提问于 2010-12-08 20:48:39
回答 2查看 431关注 0票数 0

在Mac OS X上,以下feof()调用永远不会返回。

代码语言:javascript
复制
<?php
$hostname = "localhost";
$fh = fsockopen($hostname, 80, &$errno, &$errstr);
if ($errno) {
    print $errstr;
    exit;
}
$request = <<<request
GET / HTTP/1.0
Host: $hostname
Connection: close

request;
fputs($fh,$request);
while (!feof($fh))
    echo fgets($fh);
fclose($fh);
?>

你在其他平台上也有同样的问题吗?有什么办法解决这个问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-08 21:53:34

问题不在于feof,而在于您的请求没有以正确的方式格式化。您可能知道,类Unix系统使用\n作为换行符。但是,HTTP中有一个新的行是\r\n。您需要更改您的请求:

代码语言:javascript
复制
$request = <<<request
GET / HTTP/1.1\r
Host: $hostname\r
Connection: close\r
\r\n
request;

另外,请注意,我使用的是HTTP/1.1,因为Host头不适用于HTTP1.0。它是在1.1中引入的。您还会看到,我将\n放在了最后一行。这是因为heredoc不会自动以新行结束字符串。

最后一件事,这是:

代码语言:javascript
复制
fsockopen($hostname, 80, &$errno, &$errstr);

..。是错误的。它被称为调用时按引用传递,已被弃用。最好的方法是:

代码语言:javascript
复制
fsockopen($hostname, 80, $errno, $errstr);

..。没有&的话。您将得到相同的结果,但不会触发任何错误(至少在5.3中)。

票数 1
EN

Stack Overflow用户

发布于 2010-12-08 21:47:27

你的代码在我的Ubuntu 10.10上生成了一个来自Apache的“Bad Request”。

我认为,这与请求中的行尾有关。将您的heredoc请求分配替换为以下工作:

代码语言:javascript
复制
$request = "GET / HTTP/1.0\r\n"
        . "Hostname: $hostname\r\n"
        . "Connection: close\r\n"
        . "\r\n";

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4387585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档