民间,
我正在尝试用PHP编写一个简单的套接字示例代码。 以下代码似乎正常工作:
if(!($sock = socket_create(AF_INET, SOCK_STREAM, 0)))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Couldn't create socket: [$errorcode] $errormsg \n");
}
echo "Socket created \n";
// Bind the source address
if( !socket_bind($sock, "127.0.0.1" , 5000) )
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Could not bind socket : [$errorcode] $errormsg \n");
}
echo "Socket bind OK \n";
if(!socket_listen ($sock , 10))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Could not listen on socket : [$errorcode] $errormsg \n");
}
echo "Socket listen OK \n";
echo "Waiting for incoming connections..... \n";
但是当我添加$ client = socket_accept($ sock)行时;作为下一步,我的应用程序保持加载状态约5分钟并失败!
我研究了一些东西,但我找不到线索,更不用说解决方案了。
谢谢!
答案 0 :(得分:1)
来自socket_accept()的文档:
如果没有挂起的连接,socket_accept()将阻塞,直到连接出现。
您是否有任何尝试连接到该应用程序的内容?如果你不这样做,最终socket_accept()会因default_socket_timeout而超时。
答案 1 :(得分:0)
这些是我的工作套接字脚本的片段。这是骨骼,但你会抓住漂移。
除非您这样做,否则这是一个阻止通话:
@socket_set_nonblock($sock);
然后循环使用您的连接及其发送的数据继续处理。
while(true){
if(($newc = @socket_accept($sock)) !== false) {
$con=1;
}
if($con==1){
//There is a socket. Read data from it, write data to it or close it here:
if($dataIn = socket_read($newc, 1024)){
echo "Client: " . $dataIn . "\r\n<BR>";
}
if($dataIn==""){
socket_close($newc);
return();
}
}
sleep(1);
}
答案 2 :(得分:0)
尝试在CLI上运行脚本。应该像你想要的那样工作。在浏览器上运行它最终会导致超时。