PHP:套接字监听问题

标签 php sockets

这是我的代码:

<?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/

相关文章:

php - 如何根据 2 个键对 PHP 数组进行排序,一个是升序,另一个是降序

php - Preg 匹配 {{statement}} 表达式

php - 从wordpress中的摘录末尾删除3个点

python - 具有阻塞请求的 Gevent 异步服务器

c++ - 使用 IOCP 的 TCP/IP 服务器。接收缓冲区中的偶尔数据损坏

javascript - 只从 node.js 中的套接字读取前 N 个字节

php - 路由排除 codeigniter 中的两个单词

php - 如何使用 PHP 撤消/反转 XOR?

java - 持续监听来自服务器的 UDP 数据包

c++ - 套接字 : multithreading doesn't work when client reads messages