Chinaunix首页 | 论坛 | 博客
  • 博客访问: 86950
  • 博文数量: 25
  • 博客积分: 465
  • 博客等级: 下士
  • 技术积分: 205
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-03 13:28
文章分类
文章存档

2012年(25)

我的朋友

分类: Python/Ruby

2012-08-03 15:25:31

方法一
error_reporting (E_ALL);

$service_port = 3456;
$address = "10.3.10.99";

$socket = socket_create (AF_INET, SOCK_STREAM, 0);
if ($socket < 0)
{
echo "socket_create() failed: reason: " . socket_strerror ($socket) . "\n";
exit();
}
else
{
echo "Attempting to connect to '$address' on port '$service_port'...". "\n";
$result = socket_connect ($socket, $address, $service_port);
if ($result == FALSE )
{
echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n";
exit();
}
else
{       
$send = '';
//WORD    wLength;    // 数据区有效长度,从数据区aucData[0]开始
$send = $send . pack("L",44);
//UCHAR    aucResv[TRANSFRAME_RESV_LENGTH];        // 保留
$send = $send . pack("L",0);   
//_UL     ulSIP;           源IP地址,业务不需要填写
$send = $send . pack("L",0);
//_UL     ulDIP;           // 目的IP地址,业务不需要填写
$send = $send . pack("L",0);
//_US     usDProcID;       // 目的进程ID
$send = $send . pack("S",88);
//_US     usDProcHandle;   // 目的进程Handle, 当一个进程启动多个实例时需要判断
$send = $send . pack("S",89);
//_UL     ulDCmdHandle;    // 目的命令句柄,标识一个模块内发送的命令标识
$send = $send . pack("L",90);
//_US     usSProcID;       // 源端进程ID
$send = $send . pack("S",91);
//_US     usSProcHandle;   // 源端进程Handle, 当一个进程启动多个实例时需要判断
$send = $send . pack("S",92);
//_UL     ulSCmdHandle;    // 源命令句柄,标识一个模块内发送的命令标识
$send = $send . pack("L",93);
//_US     usMsgVer;        // 消息版本号
$send = $send . pack("S",94);
//_US     usMsgType;       // 消息类型,具体类型附后
$send = $send . pack("S",95);
//_UL     ulCmdCode;       // 命令码
$send = $send . pack("L",96);
//_UC     ucReserve[8];    // 保留
$send = $send . pack("L",0);
//_UL     ulRetCode;       // 交互返回码, 应用使用, 通讯无关
$send = $send . pack("L",0);
//_UL     ulLength;        // 后附数据区长度
$send = $send . pack("L",0);       

$crc = 0xFFFF;
for ($x = 0; $x < strlen ($send); $x++)
{
$crc = $crc ^ ord($send[$x]);
for ($y = 0; $y < 8; $y++)
{
if (($crc & 0x0001) == 0x0001)
{
$crc = (($crc >> 1) ^ 0xA001);
}
else
{ $crc = $crc >> 1; }
}
}

$Realsend = '';
//DWORD    dwHeaderFlag;    // 帧的起始标志
$Realsend = $Realsend . pack("L",0xDEADDEAD);
//WORD    wCrcCode;    // CRC校验码,从长度字节wLength开始
$Realsend = $Realsend . pack("L",$crc);
$Realsend = $Realsend . $send;       

echo "the length is";
echo strlen($Realsend);
echo "the message is";
echo $Realsend;

echo "Sending Msg...";
socket_write ($socket, $Realsend, strlen ($Realsend));

$out ='';

echo "Reading response:\n\n";
$time = time();
$PP=TRUE;       

socket_set_nonblock($socket);

echo time();
while($PP)
{
$out =socket_read($socket,8);

if ((time() - $time) >= 10 )
{
echo "Time out ,Closing socket...";
$PP = FALSE;
//socket_close($socket); 
}
else
{
sleep(1);
continue;
}

}
echo time();

echo "Closing socket...";
socket_close($socket);
}
}

?>
方法二
  ignore_user_abort(true);//设置与客户机断开是否会终止脚本的执行。

  set_time_limit(0); //设置脚本超时时间,为0时不受时间限制

  ob_end_clean();//清空缓存

  ob_start();//开始缓冲数据

  while(1){

  echo str_repeat(” “,1024);//写满IE有默认的1k buffer

  ob_flush();//将缓存中的数据压入队列

  flush();//输出缓存队列中的数据

  echo “now time is “.date(‘h:i:s’) . ”
“;//打印数据,其实是先将数据存入了缓存中

  usleep(1000000);//延迟一秒(暂停一秒)

  }

  ?>

为方便理解,提供相关函数作用说明如下:

  ①ignore_user_abort(bool):设置与客户机断开是否会终止脚本的执行。

  ②set_time_limit(int seconds)设置允许脚本运行的时间,单位为秒。参数值为0时不受限制。

  ③ob_end_clean():清除服务端缓存的数据

  ④ob_start():开启一个缓存(可嵌套)

  ⑤ob_flush():将缓存中的数据压入队列

  ⑥flush():输出缓存队列中的数据

  ⑦usleep(int m-seconds):以指定的微秒数延缓程序的执行。

  注:

  flush()和ob_flush()的正确顺序应是,先ob_flush()再flush(),不可弄混。

  usleep()函数可替换成sleep()函数,不同之处在于sleep()的参数是秒。


阅读(5460) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~