一块网卡有多个IP,是否能够将同一个端口绑定在多个IP地址上?
废话不多说,上源码:
【源码1】
#include <QAbstractSocket>
#include <QHostAddress>
int main(int argc, char *argv[])
{
QAbstractSocket *qAbsSocket1 = new QAbstractSocket(QAbstractSocket::UdpSocket, NULL);
QAbstractSocket *qAbsSocket2 = new QAbstractSocket(QAbstractSocket::UdpSocket, NULL);
QHostAddress addr1("172.20.1.177");
QHostAddress addr2("192.168.199.177");
int port1 = 7777;
int port2 = 7778;
bool bindOK;
bindOK = qAbsSocket1->bind(addr1, port1);
printf("[1] qAbsSocket1 bind port:%d to addr:%s %s.\n", port1, addr1.toString().toLocal8Bit().data(), bindOK?"ok":"fail");
bindOK = qAbsSocket1->bind(addr1, port2);
printf("[2] qAbsSocket1 bind port:%d to addr:%s %s.\n", port2, addr1.toString().toLocal8Bit().data(), bindOK ? "ok" : "fail");
bindOK = qAbsSocket1->bind(addr2, port1);
printf("[3] qAbsSocket1 bind port:%d to addr:%s %s.\n", port1, addr2.toString().toLocal8Bit().data(), bindOK ? "ok" : "fail");
}
输出结果:
[1] qAbsSocket1 bind port:7777 to addr:172.20.1.177 ok.
QNativeSocketEngine::bind() was not called in QAbstractSocket::UnconnectedState
[2] qAbsSocket1 bind port:7778 to addr:172.20.1.177 fail.
QNativeSocketEngine::bind() was not called in QAbstractSocket::UnconnectedState
[3] qAbsSocket1 bind port:7777 to addr:192.168.199.177 fail.
Press any key to continue …
【结论1】
同一个Socket只可以将1个端口绑定到1个地址上。
【源码2】
#include <QAbstractSocket>
#include <QHostAddress>
int main(int argc, char *argv[])
{
QAbstractSocket *qAbsSocket1 = new QAbstractSocket(QAbstractSocket::UdpSocket, NULL);
QAbstractSocket *qAbsSocket2 = new QAbstractSocket(QAbstractSocket::UdpSocket, NULL);
QHostAddress addr1("172.20.1.177");
QHostAddress addr2("192.168.199.177");
int port1 = 7777;
int port2 = 7778;
bool bindOK;
bindOK = qAbsSocket1->bind(addr1, port1);
printf("[1] qAbsSocket1 bind port:%d to addr:%s %s.\n", port1, addr1.toString().toLocal8Bit().data(), bindOK?"ok":"fail");
bindOK = qAbsSocket2->bind(addr1, port1);
printf("[2] qAbsSocket2 bind port:%d to addr:%s %s.\n", port1, addr1.toString().toLocal8Bit().data(), bindOK ? "ok" : "fail");
}
输出结果:
[1] qAbsSocket1 bind port:7777 to addr:172.20.1.177 ok.
[2] qAbsSocket2 bind port:7777 to addr:172.20.1.177 fail.
Press any key to continue …
【结论2】
即使不同的Socket也不能重复绑定相同的地址和端口。
【源码3】
#include <QAbstractSocket>
#include <QHostAddress>
int main(int argc, char *argv[])
{
QAbstractSocket *qAbsSocket1 = new QAbstractSocket(QAbstractSocket::UdpSocket, NULL);
QAbstractSocket *qAbsSocket2 = new QAbstractSocket(QAbstractSocket::UdpSocket, NULL);
QHostAddress addr1("172.20.1.177");
QHostAddress addr2("192.168.199.177");
int port1 = 7777;
int port2 = 7778;
bool bindOK;
bindOK = qAbsSocket1->bind(addr1, port1);
printf("[1] qAbsSocket1 bind port:%d to addr:%s %s.\n", port1, addr1.toString().toLocal8Bit().data(), bindOK?"ok":"fail");
bindOK = qAbsSocket2->bind(addr1, port2);
printf("[2] qAbsSocket2 bind port:%d to addr:%s %s.\n", port2, addr1.toString().toLocal8Bit().data(), bindOK ? "ok" : "fail");
}
输出结果:
[1] qAbsSocket1 bind port:7777 to addr:172.20.1.177 ok.
[2] qAbsSocket2 bind port:7778 to addr:172.20.1.177 ok.
Press any key to continue …
【结论3】
不同的Socket可以将不同的端口绑定到相同的IP地址上。
【源码4】
#include <QAbstractSocket>
#include <QHostAddress>
int main(int argc, char *argv[])
{
QAbstractSocket *qAbsSocket1 = new QAbstractSocket(QAbstractSocket::UdpSocket, NULL);
QAbstractSocket *qAbsSocket2 = new QAbstractSocket(QAbstractSocket::UdpSocket, NULL);
QHostAddress addr1("172.20.1.177");
QHostAddress addr2("192.168.199.177");
int port1 = 7777;
int port2 = 7778;
bool bindOK;
bindOK = qAbsSocket1->bind(addr1, port1);
printf("[1] qAbsSocket1 bind port:%d to addr:%s %s.\n", port1, addr1.toString().toLocal8Bit().data(), bindOK?"ok":"fail");
bindOK = qAbsSocket2->bind(addr2, port1);
printf("[2] qAbsSocket2 bind port:%d to addr:%s %s.\n", port1, addr2.toString().toLocal8Bit().data(), bindOK ? "ok" : "fail");
}
输出结果
[1] qAbsSocket1 bind port:7777 to addr:172.20.1.177 ok.
[2] qAbsSocket2 bind port:7777 to addr:192.168.199.177 ok.
Press any key to continue …
【结论4】
不同的Socket可以将相同的端口绑定到不同的IP地址上。
【结论汇总】
1. 同一个Socket只可以将1个端口绑定到1个地址上。
2. 即使不同的Socket也不能重复绑定相同的地址和端口。
3. 不同的Socket可以将不同的端口绑定到相同的IP地址上。
4. 不同的Socket可以将相同的端口绑定到不同的IP地址上。