php socket_read 问题

老蒋 2010-08-10 09:17:45
我想用 socket_read 方法来获取整个包的内容,用的代码是
while ( ($sRead= socket_read ( $sockHttp, 2048 ))) {
$this->sResponse .= $sRead;
}
可是程序运行到这里的时候就卡在这里没有反应了,好象是死循环了,不知是什么原因,还请大家帮帮忙,谢谢!
...全文
3255 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wz_307 2010-09-01
  • 打赏
  • 举报
回复
就是判断结尾. 或者加指令判断之类的 . 不然会被socket_read阻塞住
wz_307 2010-09-01
  • 打赏
  • 举报
回复
lz 我已经解决了

可以在接收字符串的时候加验证.我的码

while(true){
if(($clientSock = socket_accept($socket)) < 0){
continue;
}
echo "Client Connect\n";

$data = "";
do{
$buf = @socket_read($clientSock, 1024, PHP_NORMAL_READ);
if(!$buf){ break; }

$data.=$buf;
if(trim($buf) == "Shut"){break 2;}
if(substr($buf, -2) == "\n"){ break;}
}while(true);


echo "Client said: $data";
}
wz_307 2010-08-30
  • 打赏
  • 举报
回复
我也遇到此问题. 同问
老蒋 2010-08-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xuzuning 的回复:]
建议减小每次读入的长度,每次一个字节都是可以的

对于你的情况,若对方只发送1000个字节就不发了(但不关闭连接),而你却还在等待剩余的1048个字节。自然表现出‘死机’了

另外,在循环中要加入意外退出的机制
[/Quote]
可以贴一下相关的Demo代码吗?
mu_rain 2010-08-11
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分
xuzuning 2010-08-11
  • 打赏
  • 举报
回复
建议减小每次读入的长度,每次一个字节都是可以的

对于你的情况,若对方只发送1000个字节就不发了(但不关闭连接),而你却还在等待剩余的1048个字节。自然表现出‘死机’了

另外,在循环中要加入意外退出的机制
老蒋 2010-08-11
  • 打赏
  • 举报
回复
试了一下1楼的方法,可还是没用。。。。
老蒋 2010-08-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cunningboy 的回复:]
要改成这样,否则一直可以读到socket的数据,变成了死循环

PHP code
while( $sRead = socket_reag( $sockHttp, 2048, PHP_NORMAL_READ) ){
$this->sResponse .= $sRead;
}
[/Quote]
是真的吗?默认是PHP_BINARY_READ,为什么不行?
Dleno 2010-08-10
  • 打赏
  • 举报
回复
socket_read
(PHP的4> = 4.1.0,PHP 5中)

socket_read - 从套接字读取一个最大长度字节
描述
字符串socket_read(资源插座,诠释长度[,int类型])


该函数socket_read()读取套接字资源的socket_create()或socket_accept()函数创建套接字。在读取的最大字节数由参数指定的长度。否则,你可以使用\ r,\ n或\ 0结束阅读(取决于类型参数,见下文)。

socket_read()返回作为一个成功的,或错误假字符串(包括数据,如果远程主机关闭了连接)。错误代码可以检索与socket_last_error()。此代码可以被传递到socket_strerror()来得到一个错误的文字表述。

注:socket_read()返回一个零长度字符串(“”)时,有没有更多的数据读取。

可选的类型参数是一个命名的常数:


PHP_BINARY_READ - 使用系统recv()函数。用于读取二进制数据的安全。 (在PHP>“默认= 4.1.0)

PHP_NORMAL_READ - 读停在\ n或\河(在PHP <= 4.0.6默认)
CunningBoy 2010-08-10
  • 打赏
  • 举报
回复
要改成这样,否则一直可以读到socket的数据,变成了死循环
while( $sRead = socket_reag( $sockHttp, 2048, PHP_NORMAL_READ) ){
$this->sResponse .= $sRead;
}

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧