是否可以运行Flask来侦听IPv4和IPv6(即双IP堆栈)?据我检查,可以使用以下方式在IPv4中运行:
app.run(host='0.0.0.0', port=port, debug=True)
Run Code Online (Sandbox Code Playgroud)
或使用IPv6
app.run(host='::', port=port, debug=True)
Run Code Online (Sandbox Code Playgroud)
但是我没有找到同时在两者中运行的方法(可以让我的Flask应用程序的实例监听IPv4而另一个实例监听IPv6,但两者都不能监听同一个端口).
谢谢!
更新(附加信息):
接着Sander Steffann的评论(谢谢!),我已经开始在IPv6中监听我的应用了:
* Running on http://[::]:1028/
* Restarting with reloader
Run Code Online (Sandbox Code Playgroud)
然后使用IPv6和IPv4 curls进行测试:
curl -g [::1]:1028/notify
curl 127.0.0.1:1028/notify
Run Code Online (Sandbox Code Playgroud)
分别获得:
::1 - - [10/Feb/2014 12:04:51] "GET /notify HTTP/1.1" 200 -
::ffff:127.0.0.1 - - [10/Feb/2014 12:05:03] "GET /notify HTTP/1.1" 200 -
Run Code Online (Sandbox Code Playgroud)
我对第二行的解释是"某人"(操作系统?Flask所依赖的底层网络库?)正在将IPv4请求转换为IPv6请求.但是,据我所知,在经典的双栈设置中支持IPv4"本机"是不一样的,即我本来期望有什么能够解决这个问题(这是我运行应用程序时得到的Running on http://0.0.0.0:1028/)()
127.0.0.1 - - [10/Feb/2014 12:05:03] "GET /notify HTTP/1.1" 200 -
Run Code Online (Sandbox Code Playgroud) 我有一个服务器实现,我需要2个独立的套接字 - 1个IPv4套接字套接字监听特定的IPv4地址和服务器端口X,以及一个IPv6套接字监听特定的IPv6地址和相同的服务器端口X.IPv4和IPv6地址打开相同的界面.
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl(v4addr);
sin.sin_port = htons(tcp_port);
Run Code Online (Sandbox Code Playgroud)
我正在使用evconnlistener_new_bind创建ipv4套接字并绑定到它.对于IPv6侦听器,代码如下.
memset(&sin6, 0, sizeof(sin6));
sin6.sin6_family = AF_INET6;
memcpy(sin6.sin6_addr.s6_addr, v6addr_bytes, IPV6_ADDR_LEN);
sin6.sin6_port = htons(tcp_port);
fd = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
evutil_make_socket_nonblocking(fd)
setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (void*)&on, sizeof(on))
setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (void*)&on, sizeof(on))
evutil_make_listen_socket_reuseable(fd) /* Libevent call to set SO_REUSEADDR */
evutil_make_socket_nonblocking(fd) /* Libevent call to set fd non-blocking */
bind(fd, (const struct sockaddr *)&sin6, sizeof(sin6))
Run Code Online (Sandbox Code Playgroud)
当我将fd绑定到特定的ipv6地址时,我会间歇地看到绑定失败.
绑定v6失败sin6 3ffe :: a00:513 - 错误99 - 无法分配请求的地址
我尝试了gdb,但每次我gdb,绑定成功.
我不确定为什么我会看到这个问题.有人可以帮忙吗?
ipv6路由器存储多个路由作为n地址的第一位.2000年,研究人员在1500条ipv6路线中发现只有14种不同的前缀长度.传入数据包根据最长前缀匹配路由到不同的传出端口,因此如果数据包x的前8位与8位路由匹配,但同一数据包的前48位与48位路由匹配,则路由器必须选择48位路线.
我的路由器正在处理如此多的数据包,因此查找路由表的内存速度是一个限制因素.在路由表中找到最长匹配前缀的好算法是什么?
如何获得套接字接收发往IPv6子网路由器任播地址的数据包?
我无法找到有关如何执行此操作的任何信息.
在一个解决方案中,我尝试使用socket.setsockopt,就像加入多播组一样:
# 7 is the interface number
s = socket(AF_INET6, SOCK_DGRAM)
packed_iface_num = struct.pack("I", 7)
group = inet_pton(AF_INET6, 'fd36:d00d:d00d:47cb::') + packed_iface_num
# socket.error: (22, 'Invalid argument')
s.setsockopt(IPPROTO_IPV6, IPV6_JOIN_GROUP, group)
Run Code Online (Sandbox Code Playgroud)
并且还使用bind
# socket.error: (99, 'Cannot assign requested address')
s.bind(('fd36:773e:6b4c:47cb::', 9876))
Run Code Online (Sandbox Code Playgroud)
正如所料,这些都没有奏效.有没有办法做到这一点?
我想知道,是否有一个库可用于将长IPv6地址(例如2002:9876:57AB:0000:0000:0000:0000:0001)的表示转换为压缩的IPv6格式(在这种情况:2002:9876:57AB :: 1).
我找不到这样的图书馆.此库不应使用任何IP Api,不得进行网络连接.
我已经试过了
return Inet6Address.getByName(longAdress).toString();
Run Code Online (Sandbox Code Playgroud)
但这只是将4个零替换为1(在本例中为2002:9876:57AB:0:0:0:0:1).
有什么建议?
我试图在C#中检索IPv6主机的MAC地址.我发现这个问题提到使用ResolveIpNetEntry2.经过一些谷歌搜索,并参考MSDN,我还没有找到如何从C#调用此函数的示例.此函数也在pinvoke.net上不公开.
有没有人有一个如何从C#调用ResolveIpNetEntry2的例子?
我使用流行的教程移植了一个支持IPv6的应用程序.我决定只为这两个协议使用一个套接字监听器.现在我意识到我必须IPV6_V6ONLY正确设置(它只能在我的x86 linux上开箱即用,但不能在我的ARM上运行).
这真的是要走的路吗?有人说不IPV6_V6ONLY应该使用(显然它已经过时了,因为通过线路进行IPv4映射),有人说使用一个套接字用于两种协议都没问题.
所以,我很困惑.这个问题的当前状态是什么?我误解了这个问题吗?
我正在尝试在node.js中通过IPv6接收多播数据报.我在IPv4(udp4)上完全相同的方式没有问题,但尝试为udp6做同样的事情让我在socket.addMembership调用时出现EINVAL错误.这是我的代码:
var dgram = require('dgram');
var server = dgram.createSocket('udp6');
var PORT = 12345;
var MULTICAST_ADDRESS = 'ff7e:230::1234';
server.on('message', function (message, remote) {
console.log('Message from: ' + remote.address + ':' + remote.port +' - ' + message);
});
server.on('listening', function () {
var address = server.address();
console.log('UDP listening on ' + address.address + ":" + address.port);
server.addMembership(MULTICAST_ADDRESS);
});
server.bind(PORT);
Run Code Online (Sandbox Code Playgroud)
这导致:
Error: addMembership EINVAL
at new errnoException (dgram.js:454:11)
at Socket.addMembership (dgram.js:396:11)
at Socket.<anonymous> (/media/sf_projects/ipv6_multicast/server.js:57:10)
at Socket.EventEmitter.emit (events.js:92:17)
at startListening (dgram.js:141:10) …Run Code Online (Sandbox Code Playgroud) 我正在维护一个使用WebRTC构建的iOS应用程序.最初的开发人员在项目中包含了一个预先构建的"libWebRTC.a".但是,自2016年6月起,Apple已强制要求所有iOS应用程序都支持IPv6.
我当前的实现不适用于IPv6.在搜索更多主题时,我遇到了这个问题:
https://bugs.chromium.org/p/webrtc/issues/detail?id=5871
这似乎表明WebRTC库存在仅在2016年6月修复的IPv6网络问题.
不幸的是我无法找到最新版本的libWebRTC.我在GitHub上遇到了多个项目,这似乎指向了这个项目:
https://github.com/pristineio/webrtc-build-scripts
但似乎这个项目可能不起作用,因为谷歌从GYP转向GN作为构建工具之一.
很高兴知道你们中是否有人设法解决这个问题并让WebRTC调用在仅支持IPv6的网络上的iOS上工作.
我使用如下命令将IP地址存储在数据库中:
cast(INET6_ATON(trim(:ipbinary)) as binary(16)))
Run Code Online (Sandbox Code Playgroud)
我的专栏是:
varbinary(16)
Run Code Online (Sandbox Code Playgroud)
我已经尝试使用mysql函数INET6_NTOA将其转换回IPv4格式,但没有任何运气.
我需要的IP是:
66.249.64.90
Run Code Online (Sandbox Code Playgroud)
DB值是:
42f9405a000000000000000000000000
Run Code Online (Sandbox Code Playgroud)
该INET6_NTOA给我:
42f9:405a::
Run Code Online (Sandbox Code Playgroud)
并INET6_NTOA(UNHEX(给我一个NULL回应.我使用PHP作为我的脚本语言,所以如果有一个函数,我也可以使用它.
这是我的完整查询:
SELECT delete_ip, INET6_NTOA(ip_binary), ip_binary FROM `stats`
Run Code Online (Sandbox Code Playgroud)
这是回复:
谢谢.
(我不能只使用delete_ip因为顾名思义列将被删除.)