访问套接字时如何设置超时时间? [英] How can I set time out for fread when access socket?

查看:103
本文介绍了访问套接字时如何设置超时时间?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

以下是我的代码.我希望当几秒钟后没有数据可读取时,fread可以返回.我叫stream_set_timeout.但这是行不通的.我也叫stream_get_meta_data.它还没有满足我的需求.我正在连接chat.facebook.com.

The following is my code. I wish fread can return when there don't have data to read after some seconds. I called stream_set_timeout. But it don't work. And I called stream_get_meta_data too. It don't give my need yet. I am connecting chat.facebook.com.

$fp = fsockopen($server, 8888, $errno, $errstr);

stream_socket_enable_crypto($fp, true, STREAM_CRYPTO_METHOD_TLS_CLIENT);

fwrite($fp, $xml);

stream_set_timeout($fp, 5);

$str = fread($fp,8192);//This code will hang when there don't have data to read.

推荐答案

如果您阅读了stream_set_timeout()的手册,就会知道stream_set_timeout()在超时情况下唯一要做的就是设置'timed_out' stream_get_meta_data()返回的数组的键为true.

If you'd read the manual for stream_set_timeout() you'd know that the only thing stream_set_timeout() does in case of timeout is setting of 'timed_out' key of the array returned by stream_get_meta_data() to true.

stream_set_timeout($fp, 5);
// set stream into non-blocking mode
stream_set_blocking($fp, false);

$break_counter = 0;
$result = '';
$info = stream_get_meta_data($fp);

while (!$info['timed_out'] && !feof($fp)) {
    $str = @fgets($fp, 1160);
    if ($str) {
        $result .= $str;
    } else {
        $break_counter += 1;

        if ($break_counter > 100) {
            break;
        }

        // 10000*100 microseconds gives you one second
        usleep(10000);
    }
    $info = stream_get_meta_data($fp);
}

这篇关于访问套接字时如何设置超时时间?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆