大约一周前,有人在StackOverflow上询问为什么他们用于连接到IPv6链接本地地址的Python代码无效,我回答说,因为它是一个链接本地地址,所以需要添加%en0(或者其他任何所需的local-interface-name是其目标IP地址的后缀.我以为我知道我在说什么,所以在回答之前我没有真正测试过我的建议(对我感到羞耻!).
今天我为自己使用了同样的技术,却发现它似乎不起作用.:^(也就是说,此代码不起作用:
>>> from socket import *
>>> s = socket(AF_INET6, SOCK_STREAM)
>>> s.connect(('fe80::21f:5bff:fe3f:1b36%en0', 2001))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in connect
socket.error: [Errno 65] No route to host
Run Code Online (Sandbox Code Playgroud)
另一方面,以下代码可以工作(带或不带%en0后缀):
>>> from socket import *
>>> s = socket(AF_INET6, SOCK_STREAM)
>>> s.connect(('fe80::21f:5bff:fe3f:1b36%en0', 2001, 0, 6))
>>>
Run Code Online (Sandbox Code Playgroud)
...但我不喜欢这样做,因为为了弄清楚要为最后一个参数提供哪个范围ID整数,我必须执行一堆不可移植的代码来迭代本地接口list,找到名为'en0'的接口,并提取其范围ID,这比我想要的更复杂.
鉴于connect()正在接受IP地址的%en0后缀,为什么不按预期使用它来确定范围ID?
FWIW,我正在使用MacOS/X 10.6.4下的Python 2.6.1进行测试.
我正在尝试编写一个侦听IPv4和IPv6地址的Web服务器.但是,我最初写的代码不起作用.然后我发现IPv6结构适用于IPv4和IPv6.所以现在我使用IPv6结构,但只有IPv4地址可以工作.这篇文章,为什么我不能将ipv6套接字绑定到一个linklocal地址,其中说添加server.sin6_scope_id = 5;所以我这样做但它仍然不接受IPv6 telnet连接.任何帮助将不胜感激,因为我彻底难倒.
谢谢!
我的代码如下:
void initialize_server(int port, int connections, char* address)
{
struct sockaddr_in6 socket_struct;
/*Creates the socket*/
if ((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
syslog(LOG_ERR, "%s\n", strerror(errno));
exit(EXIT_FAILURE);
}/*Ends the socket creation*/
/*Populates the socket address structure*/
socket_struct.sin6_family = AF_INET6;
if(address == NULL)
socket_struct.sin6_addr=in6addr_any;
else
{
inet_pton(AF_INET6, "fe80::216:3eff:fec3:3c22", (void *)&socket_struct.sin6_addr.s6_addr);
}
socket_struct.sin6_port =htons(port);
socket_struct.sin6_scope_id = 0;
if (bind(sock_fd, (struct sockaddr*) &socket_struct, sizeof(socket_struct)) < 0)
{
syslog(LOG_ERR, "%s\n", strerror(errno));
exit(EXIT_FAILURE);
}//Ends the …Run Code Online (Sandbox Code Playgroud) 问题:当我将IP地址192.168.115.67转换为数字时,它是这样完成的:
192*256 3 + 168*256 2 + 115*256 1 + 67*256 0 = 3232265027
或类似这样:
192*256 0 + 168*256 1 + 115*256 2 + 67*256 3 = 1131653312
我在网上找到两种变体,坦白说只要我使用相同的转换过程变量进行所有内部IP范围比较就无所谓了.但我想从IPv4地址计算IP V6,似乎这两种变体都在网上......导致不同的IPv6地址,只有一个可以正确...
我使用1131653312变体,因为1131653312是我看到.NET给我的变体,但3232265027是我在C++中使用的变体,这也是我在网上找到的用于IPv4到IPv6转换的变体,以及在我看到.NET使用变体1131653312之前我使用过...
我在理解System.Net.IPAddress课程时遇到了一些麻烦,因为我不知道在哪里寻找某些属性所指的定义.具体来说,是什么:
IPAddress.IsIPv6LinkLocal
IPAddress.IsIPv6Multicast
IPAddress.IsIPv6SiteLocal
IPAddress.IsIPv6Teredo
Run Code Online (Sandbox Code Playgroud)
我也很乐意接受一个解释这些概念的资源的答案.MSDN网站证明不足.
我正面临一些将我的应用程序迁移到IPv6环境中的异常问题.
我正在使用.NET远程连接来提供主机名的远程服务.该主机名(ipv6.dt112979.company)在我的DNS服务器上注册(在网卡和DNS中启用了IPv6的Windows 2003 Server上运行)作为AAAA主机.
问题是,每当我尝试连接到该服务器时,都会得到"没有这样的主机是已知的".我已经设置了Wireshark,并且没有发出任何DNS查询.我已经完成了"ipconfig/flushdns"并且观察到了相同的结果.
所以,我创建了一个简单的应用程序:
Dns.GetHostAddresses("ipv6.dt112979.company");
Run Code Online (Sandbox Code Playgroud)
结果总是"没有找到这样的主机".
我做了一个NSLOOKUP,结果是:
nslookup ipv6.dt112979.company
Server: company-dev03.company
Address: 10.200.10.207
Name: ipv6.dt112979.company
Address: fe80::a5c3:bfde:5ece:e833
Run Code Online (Sandbox Code Playgroud)
你知道问题可能是什么吗?我用.NET 3.5和.NET 4.0进行了测试,问题是一样的.测试是在Windows 7机器上进行的.
如果我有ipv6.dt112979.company的A记录,那么该呼叫会超过但只返回IPv4地址.
此致,Nuno Centeio
我有一个PHP脚本坐在服务器上,根据每台机器上设置的cronjobs,在一天中的不同时间被几台不同的机器命中.我想知道发出请求的机器的IP以及何时由浏览器生成,以下执行成功:
<?php
...
echo $_SERVER['REMOTE_ADDR'];
...
?>
Run Code Online (Sandbox Code Playgroud)
但是,当我使用CURL或我尝试使用的任何其他命令行工具(包括lynx)时,我最终得到以下垃圾:
2701:5:4a80:7d:2ee:8eff:5e61:801d
从我所做的调查来看,这是Apache没有$_SERVER为从命令行发出的请求填充变量的结果.
任何人都知道一种方法来获取命令行请求以使用该$_SERVER变量,或者我应该沿着另一条路线走?
我想通过使用其IPv6地址连接到远程MySQL实例(Google Cloud SQL实例).
我正在使用PHP PDO:
$db = new \PDO('mysql:host=<ipv6-address>;port=3306;dbname=<database-name>',
'<username>',
'<password>'
);
Run Code Online (Sandbox Code Playgroud)
但它总是失败,出现以下异常消息:
PDOException:SQLSTATE [HY000] [2002]没有到主机的路由
从终端我可以连接到MySQL实例,没有任何问题,像这样:
mysql --host=<ipv6-address> --user=<username> --<password>
Run Code Online (Sandbox Code Playgroud)
任何帮助将非常感激.
谢谢
我们向苹果提交了cordova phonegap应用程序,并拒绝了我们的应用程序不支持ipv6.这是我们第一次收到此错误,并且不确定解决此问题的确切步骤.
我们的应用程序使用亚马逊ec2,我们注意到亚马逊ec2不支持ipv6.所以我们想知道我们需要在哪里解决这个问题?在亚马逊或应用内?
如果它是亚马逊,我们如何解决它?我们试图通过添加ELB来解决亚马逊问题,但它还没有解决问题.
我们使用最新版本的cordova,所有库都是最新版本.请告诉我们
由于Apple开始拒绝无法在仅ipv6网络中进行通信的应用程序,因此还需要为使用TCP和UDP的Web服务提供公共ipv6地址.
Web服务托管在Amazon EC2 VPC中,我已遵循Amazon docs上的说明在VPC中启用ipv6路由.但我没有任何公共域或static-ipv6连接到EC2实例.
在搜索之后,我开始了解route53服务,它可以注册一个域并将其指向一些ipv6/ipv4.是正确的解决方案吗?单个域可以映射到ipv4和ipv6吗?例如,mywebservice.amazon-ec2.com指向具有ipv4和ipv6的相同ec2实例.
从ipv6请求mywebservice.amazon-ec2.com只能进行网络工作吗?
如果我误解了什么,请帮助.
(英语不是我的母语,如果有些句子很奇怪,不要担心;)).
我正在开发一个PONG游戏,顺便创建一些类来帮助我管理窗口,事件......和网络因为我在游戏中添加了局域网功能,但是目前你必须输入你想要的人的地址玩.并且解决方案是广播(用于播放器的扫描LAN).这很容易使用ipv4,只需使用地址255.255.255.255,但我们在2017年并提供仅适用于ipv4的功能...
然后我寻找一种用ipv6播放的方式,我学习了多播,但这部分让我迷失了.=(
我在Linux上使用C++中的标准库,我发现了几个不能与我合作的多播的例子.我此时所做的最好的事情是从一个程序实例向同一台计算机上的另一个实例发送一个udp数据包.
如何在Linux上用C/C++在ipv6 udp socket上进行多播?
在互联网上找到的最好的代码(我重新安排它)几乎可以工作(有一个客户端和服务器,通过向argv添加1或0来做出选择):
int main(int argc, char const *argv[]) {
struct sockaddr_in6 groupSock;
int sd = -1;
char databuf[10];
int datalen = sizeof databuf;
/* Create a datagram socket on which to send/receive. */
if((sd = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) {
perror("Opening datagram socket error");
return 1;
} else {
cout << "Opening the datagram socket...OK." << endl;;
}
/* Enable SO_REUSEADDR to allow …Run Code Online (Sandbox Code Playgroud)