有时候我们会在机器上同时绑定多个IP地址(可能都是在一个网卡上),但是我们却无法指定程序使用哪个IP地址去建立连接。
虽然我之前的另一篇文章《在Windows/Linux下程序指定IP地址》讲过一种hack的办法,但是并不总是那么有效。就比如博主最近遇到的一个QT写的程序,不知道为什么就是bind不了,不过万幸的是我们有源代码。
通过修改QT框架的QNativeSocketEngine的实现我们还是可以bind到我们需要的IP地址的。
源代码文件:src/network/socket/qnativesocketengine.cpp
在大概410行的位置,在 d->socketType = socketType 之前添加以下代码
if (socketType == QAbstractSocket::TcpSocket && protocol == QAbstractSocket::IPv4Protocol) { char* bind_addr; if (bind_addr = getenv("BIND_ADDR")) { QHostAddress bind_hostaddr = QHostAddress(QString::fromLocal8Bit(bind_addr)); if (!d->nativeBind(bind_hostaddr, 0)) { qDebug("BIND %s failed", bind_addr); } // bind之后状态是QAbstractSocket::BoundState,但是connectToHost要求必须是UnconnectedState d->socketState = QAbstractSocket::UnconnectedState; } }
使用方法
BIND_ADDR="你的IP地址" /path/to/your/program
好吧,用环境变量的办法当然不是那么美型,但是最直接有效。简单就是美啊。。。哈哈
Read: 1588