|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
完成一个功能齐全的动态站点成绩
看上面一段代码$word=HELLO;$conf=array(array(ip=>10.1.146.133,port=>2001),array(ip=>10.1.146.133,port=>2002));functionudpGet($word,$ip,$port){$sock=socket_create(AF_INET,SOCK_DGRAM,SOL_UDP);socket_set_option($sock,SOL_SOCKET,SO_SNDTIMEO,array(sec=>2,usec=>0));socket_set_option($sock,SOL_SOCKET,SO_RCVTIMEO,array(sec=>2,usec=>0));socket_sendto($sock,$word,strlen($word),0x100,$ip,$port);socket_recvfrom($sock,$result,8192,0,$host,$port);socket_close($sock);return$result;}for($i=0;$i<2;$i++){$res=udpGet($word,$conf[$i][ip],$conf[$i][port]);var_dump($res);}就是一连用UPD向两个server收发数据(为申明成绩,这里的server利用了最复杂的回射逻辑),假如统统流程一般,客户端会收到两次‘HELLO’。可是,假如服务端出了成绩呢?今朝,客户真个超不时间是2秒,假定2001端口过了3秒发数据,而2002端口没法服务,猜下了局会是甚么呢?“两个NULL!”,直觉上应当是这个谜底。假如你也这么以为,那末祝贺你,答错了。实践的谜底是:NULLstring(5)"HELLO"剖析利用tcpdump抓包,失掉以下了局(133为服务端,163为客户端,客户端php版本5.3.1,Linux内核2.6.16)12:01:39.014658IP10.1.146.163.40678>10.1.146.133.2001:UDP,length512:01:41.015121IP10.1.146.163.40678>10.1.146.133.2002:UDP,length512:01:42.016103IP10.1.146.133.2001>10.1.146.163.40678:UDP,length5两个哀求应当利用分歧的一时端口收发,但从抓包了局看,客户端固然举行了两次socket_create,但实践中却利用了统一一时端口(40678)收发数据!这就使得第二个哀求收到了第一个哀求的回包。感到上这应当算是个体系的BUG,从实行中发明,此成绩只在部分体系中存在,好比Linux内核2.6.32+php5.2.3就没有此成绩。办理每次指定socket端口,举行收发。以下面的白色代码所示。$sock=socket_create(AF_INET,SOCK_DGRAM,SOL_UDP);$sendPort=rand(10240,60000);socket_bind($sock,’10.1.146.163′,$sendPort);socket_set_option($sock,SOL_SOCKET,SO_SNDTIMEO,array(‘sec’=>2,‘usec’=>0));socket_set_option($sock,SOL_SOCKET,SO_RCVTIMEO,array(‘sec’=>2,‘usec’=>0));固然,rand的端口也有大概呈现对撞,但究竟这类机率不年夜,能够从很年夜水平上办理成绩。在我开始学习PHP以前,我从未想过要做软件工程,即便是在去听过华育国际的关于软件工程的美好前景后,因为我一直都没有想过要与代码打交道,而是想学好所学专业,做个网络工程师或者是网络安全人员。 |
|