在PHP中使用socket的几个问题(接收的最大字节数如何设置,如何判断接收完成)

magicsnake 2005-04-05 06:14:03
PHP写的网页通过socket客户端与一个c写的socket服务器端进行通信,我发现服务端发送的返回信息,PHP客户端socket每次read最多只能收到1448个字节.
$ret = socket_read($socket,2048, PHP_BINARY_READ);
我的服务器端发送了2048个字节的数据,但是客户端按照上面的语句也只能收到1448个字节.我必需要这样写:
$ret1 = socket_read($socket,2048, PHP_BINARY_READ);
$ret2 = socket_read($socket,2048, PHP_BINARY_READ);
$ret = $ret1.$ret2;
才能接收完全所有信息.
问题一:我怎样才能配置最大接收字节数超过1448的限制?

问题二:如果我的服务器发送的数据总是超过了客户端所能承受的一次性接收最大字节数,客户端怎样才能判断接收的数据已经完整而不用再执行socket_read的操作.
比如上面服务器发送的2048个字节的数据,我的客户端要接收两次,如果我多写一次接收:
$ret3 = socket_read($socket,2048, PHP_BINARY_READ);
由于服务器端已经没有数据传输了,结果客户端还在等待接收,于是就死在那里了执行不下去了,这个是我测试的结果.不知道大家是不是有这样的情况.
另外还要说明的是,c写的服务器端程序我只有数据结构接口,不能够改动服务器端的程序.
...全文
1164 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
magicsnake 2005-04-07
  • 打赏
  • 举报
回复
现在我只有通过判断接收字节数来处理了,毕竟每次接收的字节数都是定值.
如果没有别的方法,过了今天就结帖
magicsnake 2005-04-06
  • 打赏
  • 举报
回复
我自己写了一个测试用的服务器端,接收到PHP的socket请求时,返回下面的结构:
struct a
{
char b1[5];
char b2[5];
char b3[4];
};

//建立socket部分代码省略,我只列出返回结构赋值部分
struct a ret;
strcpy(ret.b1,"mmmm");
strcpy(ret.b2,"9999");
strcpy(ret.b3,"123");

send(skt, &ret, sizeof(struct a), 0);

这个应该很简单的,应该没有不符合规范吧.但是在PHP用上面两位的方法就是会卡,不知道为什么.
Meteorlet 2005-04-06
  • 打赏
  • 举报
回复
while ($ret1 = socket_read($socket,2048, PHP_BINARY_READ))
{
$ret2 .= $ret1;
}

socket_read() returns a zero length string ("") when there is no more data to read.
xuzuning 2005-04-06
  • 打赏
  • 举报
回复
你的那个“c写的socket服务器端”可能没有按照规范书写
也就可能得不到预期的结束符:false或""
magicsnake 2005-04-06
  • 打赏
  • 举报
回复
to syre(神仙)
我换成使用fsockopen的代码:
......
$socket = fsockopen($ip, $port,&$errno, &$errstr, $TimeOut);
if(!$socket)
exit();
else
{
fwrite($socket, $command, strlen ($command));
$ret = "";
while (!feof($socket))
{
$tmp = fread($socket, 1024);
$ret .= $tmp;
}
fclose($socket);
}
......
但是客户端程序还是会卡死,只有等到TimeOut才会执行下去.

to Meteorlet(www.imsorry.com.cn/blog)
客户端程序同样会卡执行不下去,循环执行到第三次的时候要等TimeOut才会返回空字符串.
-神仙- 2005-04-05
  • 打赏
  • 举报
回复
用fsocket_open打开用fread读的时候就是这样
这个完全是自动的,不用你去操心的
magicsnake 2005-04-05
  • 打赏
  • 举报
回复
用socket_read怎样判断读到eof?
或者用什么别的方法读eof?
socket_recv的flags没有说明,不知道怎么用
-神仙- 2005-04-05
  • 打赏
  • 举报
回复
不用管的
读到eof就会自动结束的

21,887

社区成员

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

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