按日归档: 2014/01/10

*HACK* 为QT的TCP socket连接绑定本地IP地址

有时候我们会在机器上同时绑定多个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