python-ngrok icon indicating copy to clipboard operation
python-ngrok copied to clipboard

IPV6支持问题

Open ymg5206 opened this issue 7 years ago • 9 comments

当服务器为一个ipv6地址时,会一直 update dns 是不是因为找不到ipv4地址所以才一直这样的啊 或者说,这个项目是不支持ipv6服务器吗 原版的windows客户端是可以支持ipv6的。。。

ymg5206 avatar Mar 27 '17 06:03 ymg5206

目前的项目貌似只支持ipv4,关于ipv6晚点我研究会,估计后续版本会支持。

hauntek avatar Mar 27 '17 08:03 hauntek

或者你修改下代码中的建立远程连接的socket.AF_INET改成socket.AF_INET6 试试

hauntek avatar Mar 27 '17 08:03 hauntek

def connectremote(host, port):
    try:
        host = socket.gethostbyname(host)
        client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        ssl_client = ssl.wrap_socket(client, ssl_version=ssl.PROTOCOL_SSLv23)
        ssl_client.connect((host, port))
        ssl_client.setblocking(1)
        logger = logging.getLogger('%s:%d' % ('Conn', ssl_client.fileno()))
        logger.debug('New connection to: %s:%d' % (host, port))
    except socket.error:
        return False

    return ssl_client

上面代码改成下面代码试试

def connectremote(host, port):
    try:
        host = socket.gethostbyname(host)
        client = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
        ssl_client = ssl.wrap_socket(client, ssl_version=ssl.PROTOCOL_SSLv23)
        ssl_client.connect((host, port))
        ssl_client.setblocking(1)
        logger = logging.getLogger('%s:%d' % ('Conn', ssl_client.fileno()))
        logger.debug('New connection to: %s:%d' % (host, port))
    except socket.error:
        return False

    return ssl_client

也就是将 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 改成试试 client = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)

hauntek avatar Mar 27 '17 08:03 hauntek

            # 检测控制连接是否连接.
            if mainsocket == False:
                ip = dnsopen(host)
                if ip == False:
                    logging.info('update dns')
                    time.sleep(10)
                    continue
                mainsocket = connectremote(ip, port)
                if mainsocket == False:
                    logging.info('connect failed...!')
                    time.sleep(10)
                    continue

然后再把这段代码改成下面的

            # 检测控制连接是否连接.
            if mainsocket == False:
                mainsocket = connectremote(host, port)
                if mainsocket == False:
                    logging.info('connect failed...!')
                    time.sleep(10)
                    continue

因为 socket.gethostbyname() 不支持ipv6所以我们就去掉它 删除源码中的所有 host = socket.gethostbyname(host)

这样就可以连接上ipv6服务器了,我刚刚测试可以。

hauntek avatar Mar 27 '17 09:03 hauntek

image ipv6服务器地址,测试结果

hauntek avatar Mar 27 '17 09:03 hauntek

谢谢作者,试了一下 是可以连了 我放路由挂几天 试试稳定性 再次感谢作者的开发

对了,试了用pyinstaller 可以编译windows客户端 有可能利用这个做一个win下的gui么,支持输入域名 端口 之类的 。 如果想做 需要哪方面的知识呢 小白一个 /(ㄒoㄒ)/~~

ymg5206 avatar Mar 28 '17 14:03 ymg5206

@ymg5206 QT(邪恶)

rikonaka avatar Mar 28 '17 16:03 rikonaka

很好用,从此家里的nas可以在任何地点访问了

Cragsman avatar Jul 04 '17 02:07 Cragsman

@ymg5206 现已支持Ipv4/Ipv6双栈

hauntek avatar Jul 26 '19 18:07 hauntek