Heim > Backend-Entwicklung > PHP-Tutorial > 求解:PHP socket 的有关问题

求解:PHP socket 的有关问题

WBOY
Freigeben: 2016-06-13 11:51:47
Original
797 Leute haben es durchsucht

求解:PHP socket 的问题
下面这段测试代码,我在本地用appserv搭建的环境,执行无误。而且可以用客户端连上去并执行。

<?php<br /> <br />//Reduce errors<br />error_reporting(~E_WARNING);<br /> <br />//Create a UDP socket<br />if(!($sock = socket_create(AF_INET, SOCK_DGRAM, 0)))<br />{<br />    $errorcode = socket_last_error();<br />    $errormsg = socket_strerror($errorcode);<br />     <br />    die("Couldn't create socket: [$errorcode] $errormsg \n");<br />}<br /> <br />echo "Socket created \n";<br /> <br />// Bind the source address<br />if( !socket_bind($sock, "localhost" , 9999) )<br />{<br />    $errorcode = socket_last_error();<br />    $errormsg = socket_strerror($errorcode);<br />     <br />    die("Could not bind socket : [$errorcode] $errormsg \n");<br />}<br /> <br />echo "Socket bind OK \n";<br /> <br />//Do some communication, this loop can handle multiple clients<br />while(1)<br />{<br />    echo "Waiting for data ... \n";<br />     <br />    //Receive some data<br />    $r = socket_recvfrom($sock, $buf, 512, 0, $remote_ip, $remote_port);<br />    echo "$remote_ip : $remote_port -- " . $buf;<br />     <br />    //Send back the data to the client<br />    socket_sendto($sock, "OK " . $buf , 100 , 0 , $remote_ip , $remote_port);<br />}<br /> <br />socket_close($sock);<br /><br />?>
Nach dem Login kopieren


但是,我放到vps上之后,它显示该端口是打开的,而且无法再次打开(第二遍执行这个脚本的时候,返回错误信息,端口已被占用)。我扫描端口发现9999确实已经是一个打开的UDP端口,但是,用客户端连得上去却没法完成通信(或许不可以发,或许不可以收,who knows。。。)

下面是phpinfo的结果,显示socket支持是打开的。(太长了,ctr+f后找到的socket都在这里了)
Configure Command	 './configure' '--prefix=/usr/local/php5' '--enable-force-cgi-redirect' '--enable-fastcgi' '--with-config-file-path=/usr/local/etc/php5/cgi' '--with-curl=/usr/local/lib' '--with-gd' '--with-gettext' '--with-jpeg-dir=/usr/local/lib' '--with-freetype-dir=/usr/local/lib' '--with-kerberos' '--with-openssl' '--with-mcrypt' '--with-mhash' '--with-mysql=/usr' '--with-mysqli=/usr/bin/mysql_config' '--with-pcre-regex=/usr/local' '--with-pdo-mysql=/usr' '--with-pear' '--with-png-dir=/usr/local/lib' '--with-xsl' '--with-zlib' '--with-zlib-dir=/usr/local/lib' '--enable-zip' '--enable-gd-native-ttf' '--with-iconv=/usr/local' '--enable-bcmath' '--enable-calendar' '--enable-ftp' '--enable-magic-quotes' '--enable-sockets' '--enable-mbstring'
Nach dem Login kopieren

Registered Stream Socket Transports	tcp, udp, unix, udg, ssl, sslv3, sslv2, tls
Nach dem Login kopieren

sockets<br /><br />Sockets Support	enabled<br />
Nach dem Login kopieren

default_socket_timeout	60	60
Nach dem Login kopieren


额,哪位大牛有过经验,跪谢啊~
------解决方案--------------------
换一个端口号

已打开的端口,就不能重复打开
------解决方案--------------------
看看防火墙什么的
------解决方案--------------------
9999 是已经打开的端口没错 但是你有没有9999这个端口有没有没其它的程序所占用 如果没有被其它的程序所占用那么可能考虑设置一下防火墙

否则的话 就换一个新的端口或者关闭占用9999端口的程序
也可以把那个程序换一个其它的端口

总之一个端口只能映射给一个程序

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage