这是我的代码:
<?php
$host = "127.0.0.1";
$portListen = 1234;
$portSend = 1240;
// create socket
$sSender = socket_create(AF_INET, SOCK_STREAM, 0);
socket_connect($sSender, $host, $portListen);
socket_write($sSender, "test", strlen ("test"));
$sListen = socket_create(AF_INET, SOCK_STREAM, 0);
socket_set_option($sListen, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($sListen, $host, $portSend);
socket_listen($sListen,1);
$dataSock = socket_accept($sListen);
echo socket_read($dataSock, 3, PHP_NORMAL_READ);
// close sockets
socket_close($sSender);
socket_close($sListen);
?>
我将“test”发送到另一个应用程序,它接收并发回“ack”。问题是,我只能做一次。如果我刷新,我会收到地址已使用错误。我尝试了php.net上建议的解决方案但无济于事。在socket_close()之前尝试socket_shutdown()只会给我未连接警告,刷新后会给我一个永无休止的加载。
据我了解,套接字没有立即关闭的原因是因为缓冲区中仍然有数据。但正如您所看到的,我明确声明仅监听 1 个连接。另外,我只从我的应用程序发送 3 个字符,并在此脚本中读取 3 个字符。
我做错了什么?
编辑:我使用 2 个套接字的原因是因为在 write() 之后我无法 Listen(),这给了我套接字已连接错误。跳过listen()并在write()之后直接进行read()会给我无效参数错误。
最佳答案
我明白了,在睡了几个小时并重新分析我的代码和文档之后,我设法修复了所有问题。你们是对的,1个 socket 确实足够了,而且是正确的方法:
<?php
$host = "127.0.0.1";
$portListen = 1234;
$sSender = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
socket_connect($sSender, $host, $portListen) or die("Could not connect\n");
socket_write($sSender, "test", strlen ("test")) or die("Could not write output\n");
echo socket_read($sSender, 3, PHP_NORMAL_READ);
socket_close($sSender);
?>
就这么简单!
关于PHP:套接字监听问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/726960/