gpt4 book ai didi

PHP 套接字处于半工作状态

转载 作者:可可西里 更新时间:2023-11-01 12:59:29 28 4
gpt4 key购买 nike

因此,我让 mIRC 在端口 1235 上进行监听(请耐心等待),并且我尝试制作一个 php 脚本以连接到我的本地主机服务器上的此类端口。

我的本​​地主机是一个干净的 Apache+PHP,在另一台计算机(局域网内)上运行 mIRC。

该脚本的工作原理是:1)它连接到1235端口2) 它发送 $i2.1)但在另一边没有收到任何消息(也就是我收到 socks 读取事件但没有弹出文本)3)它正确读取所有传入的消息4)当“结束”是消息时它关闭鼓声5) 它仅在 while 函数不存在时才有效。5.1) 又名 Inifi 加载。它仅在通过“结束”关闭套接字时显示 echo

这是代码,这是我在 php.net 上找到的一个简单示例,在此先感谢 :)

    <?php
//The Client
error_reporting(E_ALL);

$address = "192.168.1.101";
$port = 1235;

/* Create a TCP/IP socket. */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
} else {
echo "socket successfully created.\n";
}

echo "Attempting to connect to '$address' on port '$port'...";
$result = socket_connect($socket, $address, $port);
if ($result === false) {
echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
} else {
echo "successfully connected to $address.\n<br>";
}
$allow = true;
$i = 0;
while ($allow == true)
{
$i++;
echo "Sending $i to server.\n<br>";
socket_write($socket, $i, strlen($i));

$input = socket_read($socket, 2048);
if ($input == 'end') {
$allow = false;
}
echo "Response from server is: $input\n";
sleep(5);
}

echo "Closing socket...";
socket_close($socket);
?>

这是我在浏览器中得到的,在说“结束”之后

socket successfully created. Attempting to connect to '192.168.1.101' on port '1235'...successfully connected to 192.168.1.101. Sending 1 to server. Response from server is: ok Response from server is: end

这是在 mIRC 中:

test: 89.152.172.21 is in! read close Blockquote

如果我让它工作一个小时,将“读取”乘以 60 和“将 N+1 发送到服务器”但这只会在 socks 关闭后出现(或通过停止 while)

最佳答案

您有“普通”socket_write()socket_read() 调用。不幸的是,套接字函数在设计上是不可靠的(这是从 BSD 套接字继承的行为)。您不能只调用 socket_write() 并期望它实际写入字节(听起来很奇怪……)

PHP 手动引用:

socket_write() does not necessarily write all bytes from the given buffer. It's valid that, depending on the network buffers etc., only a certain amount of data, even one byte, is written though your buffer is greater. You have to watch out so you don't unintentionally forget to transmit the rest of your data.

您必须检查已写入了多少字节并不断重试,直到发送完您想要的所有字节。

阅读也是如此。读取调用可以读取您请求的内容或更少,您需要重试调用。

确保将套接字设置为阻塞,然后在循环中调用读/写,或使用(同样糟糕的)select() 调用来查找哪些套接字可能某些数据或可能已完成发送。


如果您想要的 API 不是 PITA,请使用 streams相反,它们具有可靠的读/写。

如果您不一定需要 PHP,请查看 Node JS ,这是专门为具有长期网络连接的程序设计的服务器/环境。

关于PHP 套接字处于半工作状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4897276/

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