如何通过套接字检查特定网络中的IP是否存在?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通过套接字检查特定网络中的IP是否存在?相关的知识,希望对你有一定的参考价值。

我正在为我的大学建立一个出勤申请,我希望通过网络标记学生的出勤率。每个教室都有单独的路由器,我想基本检查学生是否坐在路由器的范围内,并相应地标记他们的出勤率。如何检查路由器的范围是否存在,是否可以通过Web套接字进行检查?或者我如何通过网络套接字ping或做某事来检查特定的IP是否存活?

我正在使用kotlin来开发我的应用程序。请帮忙。

答案

我如何通过网络套接字ping或做某事来检查特定的IP是否存活?

你不能强迫客户端只允许你使用他们的IP地址ping他们。最好的方法是将用户连接到中央服务器(通过示例中的websocket)并检查websocket上的心跳。

为此,当然您必须首先授权您的学生,并确保每个人都在他们的websocket上有一个令牌,以便您可以跟踪他们在您的系统中的存在。那你需要某种心跳系统。我见过的大多数websocket实现已经实现了pingpong。它可以双向工作:

有一点,检查是否连接了其他点应发送ping请求,另一点如果连接则自动发回pong消息。

在我们写的应用程序中,我们有间隔向客户发送ping,我们坚持他们的pong时间戳。如果最后一个乒乓时间戳太旧,那么我们就知道连接失败或客户端在网络上不可用。

虽然,如果websocket关闭或面临错误,会调用一个方法(如onError()onClose()),然后通知您。但实现心跳服务可以帮助您确保您的连接确实存在,并且必须在基于websocket的系统中使用。

如何检查路由器的范围是否存在,是否可以通过Web套接字进行检查?

如果我没错,你负责设计应用程序的两面(客户端和服务器)。因此,您可以让用户一次又一次地尝试连接到您的LOCAL IP地址,直到连接成功。您只需确保通过其他路由器可以访问您的服务器IP地址。

注意:在本地网络上,如果学生不能使用其他教室路由器连接,那么您可以检查他们的websocket IP地址。在此之前,应该有一个表将每个用户映射到他们可以发送消息的IP地址。

实现此目的的另一种方法如果您的服务器不在本地网络中,则为这些路由提供相同的公共IP地址(或静态IP地址),并将您的流量通过Internet路由到您的服务器公共IP地址。然后,为了确保用户只能从这些路由器(在这些路由器的范围内)进行连接,您必须在服务器防火墙中允许这些路由器的IP地址(或者您可以在服务器应用程序端执行此操作)并阻止您的任何其他连接。 websocket端口。

再次注意2,如果您的服务器不在本地网络中,但您仍想确保每个用户都在其有效的教室中,则需要一个代理服务器。像这样工作:

客户端连接到其教室路由器>路由器连接到本地代理服务器>代理服务器将路由器IP地址添加到websocket消息并将其发送到公共服务器>公共服务器可以处理消息并具有用户本地IP地址

另一答案

你可以ping IP。但是,似乎每个学生都应该获得每个班级的永久本地知识产权。这是如何ping到IP的示例:

fun ping(ip: String): String {
        var str = ""
        try {
            val process = Runtime.getRuntime().exec(
                    "/system/bin/ping -c 8 " + ip)
            val reader = BufferedReader(InputStreamReader(
                    process.inputStream))
            var i: Int
            val buffer = CharArray(4096)
            val output = StringBuffer()
            i = reader.read(buffer)
            while (i > 0) {
                output.append(buffer, 0, i)
                i = reader.read(buffer)
            }
            reader.close()
            str = output.toString()
        } catch (e: IOException) {
            e.printStackTrace()
        }

    return str
}
另一答案

只有在他/她处于特定的坐标或GPS位置时,为什么不能让用户登录应用程序,而不是通过IP地址进行检查。这样,即使您的IP地址将来发生变化,也无需更新应用。

在您的服务器中,保留每个班级的位置列表。只有当学生在该位置范围内时,才允许他/她登录该应用程序。

有关详细信息,请参阅Check if a latitude and longitude is within a circle

另一答案

您可以找到的唯一位置是路由器的ARP表。终端不能保证返回它没有要求的任何内容,而路由器需要这些信息才能正确地将流量回流到终点。

以上是关于如何通过套接字检查特定网络中的IP是否存在?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 IP 地址是不是来自 Java 中的特定网络/网络掩码?

如何检查 scapy 数据包中是不是存在层?

嗅探特定连接

通过在 Sql 中使用表名中的特定单词检查表是不是存在

接口测试-接口调不通

通过 Android 中的内容提供程序检查数据库表是不是存在