gpt4 book ai didi

php - PHP:套接字监听问题

转载 作者:行者123 更新时间:2023-12-03 11:51:34 25 4
gpt4 key购买 nike

这是我的代码:

<?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);
?>

我将“测试”发送到另一个应用程序,它接收并发送回“ack”。问题是,我只能做一次。如果刷新,我会得到该地址已被使用的错误。我尝试了在 php.net上建议的解决方案,但无济于事。尝试在socket_close()之前尝试socket_shutdown()只会给我未连接警告,而刷新后将给我带来永无止境的加载。

据我了解,套接字没有立即关闭的原因是因为缓冲区中仍然有数据。但是正如您所看到的,我明确声明仅监听1个连接。另外,我仅从我的应用程序发送3个字符,并在此脚本中读取3个字符。

我究竟做错了什么?

编辑:我使用2个套接字的原因是因为在给我套接字已连接的write()之后,我无法监听()。跳过listen()并在write()之后直接进入read()会给我无效的参数错误。

最佳答案

我看到经过几个小时的 sleep 并重新分析了我的代码和文档后,我设法解决了所有问题。你们是对的,一个 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 - PHP:套接字监听问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/726960/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com