下面是一些代码,用于确定应该在多宿主框上工作的本地主机名:
/**
* Work out the first local host name by iterating the network interfaces
*
* @return
* @throws SocketException
*/
private String findFirstLocalHostName() throws SocketException {
Enumeration<NetworkInterface> ifaces = NetworkInterface.getNetworkInterfaces();
while (ifaces.hasMoreElements()) {
NetworkInterface iface = ifaces.nextElement();
Enumeration<InetAddress> addresses = iface.getInetAddresses();
while (addresses.hasMoreElements()) {
InetAddress add = addresses.nextElement();
if (!add.isLoopbackAddress() && add.isSiteLocalAddress()) {
return add.getHostName();
}
}
}
throw new RuntimeException("Failed to determine local hostname");
}
Run Code Online (Sandbox Code Playgroud)
对isSiteLocalAddress的调用是否会引入错误?我找不到有关此方法的任何有用信息,但我感觉它只与IP v 6有关并且已被弃用.
我需要执行以下查询:
SELECT * FROM users WHERE ip LIKE '88.99.%';
Run Code Online (Sandbox Code Playgroud)
问题是inet数据类型似乎不支持通配符(至少不是我在前面的查询中使用它们的方式).
我想知道的是,在指定LIKE过滤器之前将字段转换为字符串是否是明智之举?(另一方面,即使方法本身有效,这可能会减慢整个查询的速度.)
我想检查一系列范围内是否存在IP,例如: SELECT * FROM ip_address WHERE ip IN (<list of ip ranges>)
Postgresql文档声明使用<<运算符来检查IP是否包含在单个IP范围内,例如:inet '192.168.1.5' << inet '192.168.1/24'但是我不确定如何在范围列表中使用它而不必构造<<链的<<的.
我正在尝试使用无效端口连接到某个主机,我想在X秒后获得超时.怎么做 ?
我的代码:
$sock = new IO::Socket::INET(
PeerAddr => $_[0],
PeerPort => $_[1],
Proto => 'tcp',
Timeout => 2
);
Run Code Online (Sandbox Code Playgroud) 在我的mochiweb应用程序中,我使用长期持有的HTTP请求.我想检测与用户的连接何时死亡,我想通过这样做来弄清楚如何做到这一点:
Socket = Req:get(socket),
inet:setopts(Socket, [{active, once}]),
receive
{tcp_closed, Socket} ->
% handle clean up
Data ->
% do something
end.
Run Code Online (Sandbox Code Playgroud)
这适用于:用户关闭其选项卡/浏览器或刷新页面.然而,当互联网连接突然死亡(说wifi信号突然丢失),或者当浏览器异常崩溃时,我无法检测到tcp关闭.
我错过了什么,或者还有其他方法可以实现这一目标吗?
我inet_aton用来将IPv4 IP(216.12.207.142)转换为字符串3624718222.我使用以下代码:
ip_dec = unpack('>L', inet_aton(ip))[0]
Run Code Online (Sandbox Code Playgroud)
现在我需要将IPv6 ip 2001:23 :: 207:142转换为类似的字符串.它给我错误,因为它不是IPv4地址.我怎样才能做到这一点?
我正在使用ipv4和ipv6存储在postgres db中.
因为ipv4需要32位(4字节)而ipv6需要128(16byte)位.那么为什么在postgres中CIDR和INET数据类型的存储分别为IPV4和IPV6(8.1)的12字节和24字节.
对于IPV4和IPV6,它分别有7个字节和19个字节.
我不明白为什么它需要超过16字节的额外字节用于存储IPV6和4字节用于IPV4?
http://www.postgresql.org/docs/8.1/static/datatype-net-types.html
http://www.postgresql.org/docs/9.1/interactive/datatype-net-types.html
我的 Rails 项目有问题。在以前的项目(不是 Rails)中,我只是使用 PostgreSQL 中的“inet”类型来存储带有子网的 IP 地址,如下所示:
192.168.1.0/30
192.168.1.1/30
192.168.1.2/30
192.168.1.3/30
Run Code Online (Sandbox Code Playgroud)
这是将 IP 和子网存储在一个字段中的好方法。现在我在 Rails (4.0.1) 和 Ruby (2.0.0 p247) 中使用 inet 类型,但是当我阅读和尝试时,Rails 将它转换为 IPAddr 对象。但是这个 IPAddr 对象正在破坏我的格式。它将上面的四个示例转换为以下内容:
192.168.1.0/30
Run Code Online (Sandbox Code Playgroud)
有没有办法阻止 Rails 这样做,或者有没有办法用字符串代替它?或者也许是另一个宝石?
当我尝试存储某些内容时,甚至当我尝试从数据库中读取现有值时,都会出现问题。
只是为了更细化:
IPAddr.new("192.168.1.2/255.255.255.252")
Run Code Online (Sandbox Code Playgroud)
创建数据库条目:
192.168.1.0/24
Run Code Online (Sandbox Code Playgroud) 我正在尝试转换用户输入的 IP 地址,以便我可以对其执行一些按位运算以及已存储在结构中的地址。然而,我的问题是,当 IP 地址转换回时,输出始终为 255.255.255.255。例如,输入 10.0.0.1 或 192.16.2.1 总是返回 255.255.255.255。
任何帮助,将不胜感激。谢谢
{
struct sockaddr_in sa;
char ipinput[INET_ADDRSTRLEN];
fputs("Enter an IP Address: ", stdout);
fflush(stdout);
fgets(ipinput, sizeof ipinput, stdin);
inet_pton(AF_INET, ipinput, &(sa.sin_addr));
inet_ntop(AF_INET, &(sa.sin_addr), ipinput, INET_ADDRSTRLEN);
printf("IP Address = \%s\ \n", ipinput);
}
Run Code Online (Sandbox Code Playgroud) 我目前正在一个基于 PHP 的项目中使用 IPv4 和 IPv6 地址,并且我需要能够比较两个 IP 以确定哪一个数字更大。例如,192.168.1.9 大于 192.168.1.1。为了做到这一点,我使用inet_pton和unpack将 IP 转换为二进制字符串(我熟悉ip2long,但它仅限于 IPv4)。
这种方法一开始似乎工作正常,但我很快发现,当我将任何以 .32 结尾的 IP 与较低的 IP 地址进行比较时,我得到的结果不正确。例如,如果我将 192.168.1.0 与 192.168.1.32 进行比较,我的脚本会告诉我 192.168.1.0 大于 192.168.1.32。仅当其中一个 IP 以 0.32 结尾时才会发生这种情况。IP 的前三个八位字节可以更改,结果是相同的。
以下 PHP 代码生成一个说明此问题的页面:
// Loop through every possible last octet, starting with zero
for ($i = 0; $i <= 255; $i++) {
// Define two IPs, with second IP increasing on each loop by 1
$IP1 = "192.168.1.0";
$IP2 = "192.168.1.".$i; …Run Code Online (Sandbox Code Playgroud)