- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
这是我用来扫描端口是否打开的代码。
https://stackoverflow.com/a/8957053/2203703
有人可以尝试修复它吗?它似乎无法正常工作,即使端口关闭,代码总是返回“成功连接”
这是我用 80 端口测试过的 ip 列表
79.142.126.3 //Connection refused
222.165.195.103 //Connection refused
64.75.193.162 //Connection refused
118.97.197.146 //Port is open
222.134.154.103 //Connection timed out
173.0.59.170 //Port is open
这是输出:
5 sockets connected successfully
79.142.126.3 connected successfully
222.165.195.103 connected successfully
64.75.193.162 connected successfully
118.97.197.146 connected successfully
173.0.59.170 connected successfully
代码看起来不错,但我真的找不到问题。
有什么帮助吗?
最佳答案
您链接的代码是很久以前写的,当时我对非阻塞 I/O 的许多方面的了解有限。
这确实需要一个事件循环,它有很多实现,但对于这个例子,我将使用 @rdlowrey的 Alert库,因为它是一个应该相当容易理解的极简代码。您也可以在 React 循环,这是更高级别并提供更多功能。
请注意,下面的示例需要 PHP 5.4+
<?php
// Array of addresses to test
$addresses = [
'192.168.5.150',
'192.168.5.152',
'google.com', // Important note: DNS is resolved synchronously here.
'192.168.5.155', // this can seriously slow down the process as it can block
'192.168.5.20', // for a few seconds, async DNS resolution is non-trivial
'192.168.40.40', // though
];
// The TCP port to test
$port = 80;
// The length of time in seconds to allow host to respond
$timeout = 5;
// This will hold the results
$lookups = [];
// Create a reactor
$reactor = (new \Alert\ReactorFactory)->select();
$count = count($addresses);
$completedCount = 0;
$onComplete = function($address, $result)
use(&$lookups, &$completedCount, $count, $reactor) {
// Cancel the watchers for this address
$reactor->cancel($lookups[$address]['failWatcher']);
$reactor->cancel($lookups[$address]['writeWatcher']);
$reactor->cancel($lookups[$address]['readWatcher']);
// Store the result
$lookups[$address] = $result;
// If there's nothing left to do, stop the reactor
if (++$completedCount == $count) {
$reactor->stop();
}
};
foreach ($addresses as $address) {
// Normalise the address to lower-case, as it will be used as an array key
$address = strtolower($address);
if (!isset($lookups[$address])) {
// Create a socket to connect asynchronously
$sockAddr = "tcp://{$address}:{$port}";
$flags = STREAM_CLIENT_ASYNC_CONNECT;
$socket = stream_socket_client($sockAddr, $errNo, $errStr, 0, $flags);
stream_set_blocking($socket, 0);
// Set up a timeout to watch for failed connections
$failWatcher = function() use($address, $onComplete, $timeout) {
echo "{$address} connect failed: Connect timed out\n";
$onComplete($address, false);
};
$failWatcherId = $reactor->once($failWatcher, $timeout);
// Watch for the stream becoming writable (connection success)
$writeWatcher = function() use($address, $onComplete) {
echo "{$address} connected successfully\n";
$onComplete($address, true);
};
$writeWatcherId = $reactor->onWritable($socket, $writeWatcher);
// Watch for the stream becoming readable (success or explicit fail)
$readWatcher = function() use($address, $onComplete, $socket) {
if ('' === $data = fread($socket, 1024)) {
echo "{$address} connect failed: Server refused connection\n";
$onComplete($address, false);
} else if ($data === false) {
echo "{$address} connect failed: Stream read error\n";
$onComplete($address, false);
} else {
echo "{$address} connected successfully\n";
$onComplete($address, true);
}
};
$readWatcherId = $reactor->onReadable($socket, $readWatcher);
// Store the watcher IDs so they can be destroyed later
$lookups[$address] = [
'failWatcher' => $failWatcherId,
'writeWatcher' => $writeWatcherId,
'readWatcher' => $readWatcherId,
];
}
}
// Set everything going
$reactor->run();
// $lookups is now an array of booleans indicating whether the address resulted
// in a successful connection
关于php - TCP 连接使用套接字返回错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20360167/
我使用下拉菜单提供一些不同的链接,但我希望这些链接在同一选项卡中打开,而不是在新选项卡中打开。这是我找到的代码,但我对 Javascript 非常缺乏知识 var urlmenu = docume
我对 javascript 不太了解。但我需要一个垂直菜单上的下拉菜单,它是纯 JavaScript,所以我从 W3 复制/粘贴脚本:https://www.w3schools.com/howto/t
我已经坐了 4 个小时,试图让我的导航显示下 zipper 接垂直,但它继续水平显示它们。我无法弄清楚为什么会发生这种情况或如何解决它。 如果有人能告诉我我做错了什么,我将不胜感激。我有一个潜移默化的
我正在尝试创建选项卡式 Accordion 样式下拉菜单。我使用 jQuery 有一段时间了,但无法使事件状态达到 100%。 我很确定这是我搞砸的 JS。 $('.service-button').
对于那些从未访问过 Dropbox 的人,这里是链接 https://www.dropbox.com/ 查看“登录”的下拉菜单链接。我如何创建这样的下 zipper 接? 最佳答案 这是 fiddle
我正在制作一个 Liferay 主题,但我在尝试设计导航菜单的样式时遇到了很多麻烦。我已经为那些没有像这样下拉的人改变了导航链接上的经典主题悬停功能: .aui #navigation .nav li
如果您将鼠标悬停在 li 上,则会出现一个下拉菜单。如果您将指针向下移至悬停时出现的 ul,我希望链接仍然带有下划线,直到您将箭头从 ul 或链接移开。这样你就知道当菜单下拉时你悬停在哪个菜单上。 知
我有一个带有多个下拉菜单的导航栏。因此,当我单击第一个链接时,它会打开下拉菜单,但是当我单击第二个链接时,第一个下拉菜单不会关闭。 (所以如果用户点击第二个链接我想关闭下拉菜单) // main.js
我正在尝试制作一个导航下拉菜单(使用 Bootstrap 3),其中链接文本在同一行上有多个不同的对齐方式。 在下面的代码中,下拉列表 A 中的链接在 HTML 中有空格字符来对齐它们,但是空白被忽略
我希望有人能帮我解决这个 Bootstrap 问题,因为我很困惑。 有人要求我在底部垂直对齐图像和其中包含图像的链接。 我面临的问题是他们还希望链接在链接/图像组合上具有 pull-right,这会杀
我正在构建一个 Rails 应用程序,并希望指向我的类的每个实例的“显示”页面的链接显示在“索引”页面的下拉列表中。我目前正在使用带有 options_from_collection_for_sele
我有以下 Bootstrap3 导航菜单 ( fiddle here )。我想设置“突出显示”项及其子链接与下拉列表 1 和 2 链接不同的链接文本(和悬停)的样式。我还希望能够以不同于 Highli
我对导航栏中的下拉菜单有疑问。对于普通的导航链接(无下拉菜单),我将菜单文本放在 H3 中,但是当我尝试对下 zipper 接执行相同操作时,箭头不在标题旁边,而是在标题下方。我决定用 span 替换
我是一名优秀的程序员,十分优秀!