小女巫 发表于 2015-2-4 00:11:06

PHP教程之在PHP中利用socket_raw

我的这套线路可能跟许多学习PHP的爱好者不谋而合,这也算是一个循序渐进的学习过程,不过新手不要看到上面的概括就以为学习蛮简单的,默默在此不得不对您稍微泼一下冷水,任何东西其实都不简单。   <?php
class Net_Ping
{
var $icmp_socket;
var $request;
var $request_len;
var $reply;
var $errstr;
var $time;
var $timer_start_time;
function Net_Ping()
{
   $this->icmp_socket = socket_create(AF_INET, SOCK_RAW, 1);
   socket_set_block($this->icmp_socket);
}

function ip_checksum($data)
{
   for($i=0;$i<strlen($data);$i += 2)
   {
         if($data[$i+1]) $bits = unpack('n*',$data[$i].$data[$i+1]);
         else $bits = unpack('C*',$data[$i]);
         $sum += $bits;
   }
   
   while ($sum>>16) $sum = ($sum & 0xffff) + ($sum >> 16);
   $checksum = pack('n1',~$sum);
   return $checksum;
}
function start_time()
{
   $this->timer_start_time = microtime();
}

function get_time($acc=2)
{
   // format start time
   $start_time = explode (" ", $this->timer_start_time);
   $start_time = $start_time + $start_time;
   // get and format end time
   $end_time = explode (" ", microtime());
   $end_time = $end_time + $end_time;
   return number_format ($end_time - $start_time, $acc);
}
function Build_Packet()
{
   $data = "abcdefghijklmnopqrstuvwabcdefghi"; // the actual test data
   $type = "\x08"; // 8 echo message; 0 echo reply message
   $code = "\x00"; // always 0 for this program
   $chksm = "\x00\x00"; // generate checksum for icmp request
   $id = "\x00\x00"; // we will have to work with this later
   $sqn = "\x00\x00"; // we will have to work with this later
   // now we need to change the checksum to the real checksum
   $chksm = $this->ip_checksum($type.$code.$chksm.$id.$sqn.$data);
   // now lets build the actual icmp packet
   $this->request = $type.$code.$chksm.$id.$sqn.$data;
   $this->request_len = strlen($this->request);
}

function Ping($dst_addr,$timeout=5,$percision=3)
{
   // lets catch dumb people
   if ((int)$timeout <= 0) $timeout=5;
   if ((int)$percision <= 0) $percision=3;
   
   // set the timeout
   socket_set_option($this->icmp_socket,
   SOL_SOCKET,// socket level
   SO_RCVTIMEO, // timeout option
   array(
       "sec"=>$timeout, // Timeout in seconds
       "usec"=>0// I assume timeout in microseconds
       )
   );
   if ($dst_addr)
   {
   if (@socket_connect($this->icmp_socket, $dst_addr, NULL))
   {
   
   } else {
       $this->errstr = "Cannot connect to $dst_addr";
       return FALSE;
   }
   $this->Build_Packet();
   $this->start_time();
   socket_write($this->icmp_socket, $this->request, $this->request_len);
   if (@socket_recv($this->icmp_socket, &$this->reply, 256, 0))
   {
       $this->time = $this->get_time($percision);
       return $this->time;
   } else {
       $this->errstr = "Timed out";
       return FALSE;
   }
   } else {
   $this->errstr = "Destination address not specified";
   return FALSE;
   }
}
}
$ping = new Net_Ping;
$ping->ping("<a href="http://www.谷歌.ca" target=_blank>www.谷歌.ca</a>");
if ($ping->time)
echo "Time: ".$ping->time;
else
echo $ping->errstr;
刚开始写页面程序,调试完书中的例子。然后就可以尝试编写留言板了,

透明 发表于 2015-2-4 09:50:59

我还是推荐用firefox ,配上firebug 插件调试js能省下不受时间。谷歌的浏览器最好也不少用,因为谷歌的大侠们实在是太天才啦,把一些原来的js代码加了一些特效。

admin 发表于 2015-2-6 02:44:43

对于初学者来说不推荐去拿钱买的。当然如果一个网站你经常去用,而且里面的资料也比较有用,最好还是买个会员比较好,毕竟那些也是别人的工作成果。

只想知道 发表于 2015-2-6 09:59:30

说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年具体的记不清啦,囧。

爱飞 发表于 2015-2-15 22:42:46

如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,

若相依 发表于 2015-2-26 11:34:03

我还是强烈建议自己搭建php环境。因为在搭建的过程中你会遇到一些问题,通过搜索或是看php手册解决问题后,你会更加深刻的理解它们的工作原理,了解到php配置文件中的一些选项设置。

因胸联盟 发表于 2015-3-2 10:19:24

有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。

愤怒的大鸟 发表于 2015-3-8 16:16:08

如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,

不帅 发表于 2015-3-11 12:02:31

其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎

分手快乐 发表于 2015-3-11 13:02:50

最后祝愿,php会给你带来快乐的同时 你也会给他带来快乐。

蒙在股里 发表于 2015-3-18 11:55:20

做为1门年轻的语言,php一直很努力。

海妖 发表于 2015-3-24 10:40:48

微软最近出的新字体“微软雅黑”,虽然是挺漂亮的,不过firefox支持的不是很好,所以能少用还是少用的好。

兰色精灵 发表于 2015-4-11 07:08:45

作为一个合格的coder 编码的规范是必须,命名方面我推崇“驼峰法”,另外就是自己写的代码最好要带注释,不然时间长了,就算是自己的代码估计看起来都费事,更不用说别人拉。

灵魂腐蚀 发表于 2015-4-11 11:29:44

在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。

第二个灵魂 发表于 2015-4-14 07:56:12

对于初学者来说不推荐去拿钱买的。当然如果一个网站你经常去用,而且里面的资料也比较有用,最好还是买个会员比较好,毕竟那些也是别人的工作成果。

再见西城 发表于 2015-4-14 23:22:57

如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,

谁可相欹 发表于 2015-4-26 12:14:49

要进行开发,搭建环境是首先需要做的事,windows下面我习惯把环境那个安装在C盘下面,因为我配的环境经常出现诡异事件,什么事都没做环境有的时候就不能用啦。

山那边是海 发表于 2015-5-6 19:09:15

学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。

简单生活 发表于 2015-6-14 02:15:50

本文当是我的笔记啦,遇到的问题随时填充

老尸 发表于 2015-6-18 22:07:01

我学习了一段时间后,我发现效果并不好(估计是我自身的问题)。因为一个人的精力总是有限的,同时学习这么多,会导致每个的学习时间都得不到保证。
页: [1] 2
查看完整版本: PHP教程之在PHP中利用socket_raw