localhost、127.0.0.1对网络编程造成不通的说明
平時大家都有過網絡編程的經驗,一般地,我們為了方便經常用localhost或者127.0.0.1,代替本機IP地址,如下為Qt編寫的一段網絡應用程序的代碼:
m_UdpSocket = new QUdpSocket(this); m_UdpSocket->bind(QHostAddress(“127.0.0.1”),8888); connect(&m_UdpSocket, &QUdpSocket::readyRead, this, &CCmdProcess::readPendingDatagrams);或者
m_UdpSocket = new QUdpSocket(this); m_UdpSocket->bind(HostAddress(QHostAddress::LocalHost),8888); connect(&m_UdpSocket, &QUdpSocket::readyRead, this, &CCmdProcess::readPendingDatagrams);上述兩段代碼當本機只有一個網卡時,當網絡程序的遠端來連接本端時,QUdpSocket類的readyRead信號確實能激發,本端程序確實能進入相應的readPendingDatagrams槽函數。
但是當本機有多張網卡時,上述代碼不一定起作用,也就是說QUdpSocket類的readyRead信號有時不能被激發,本端程序有時不能進入相應的readPendingDatagrams槽函數。這是因為:
當本機有多個網卡(為了便于后文描述,暫且以兩個網卡為例,稱為網卡A,網卡B。A網卡在局域網的地址暫且稱為192.168.1.101,B網卡在局域網的地址暫且稱為192.168.1.102)時,QHostAddress::LocalHost有可能綁定的是A網卡,也即QHostAddress::LocalHost此時指示的IP可能是192.168.1.101;也有可能綁定的是B網卡也即QHostAddress::LocalHost此時指示的IP可能是192.168.1.102,而網絡上的遠端程序在編程時,肯定得將網絡通信的對端(本例指本端)的IP寫死才行,否則無法編程。而本端綁定的IP為QHostAddress::LocalHost或127.0.0.1可能是192.168.1.102或192.168.1.101,這樣不確定的IP會導致網絡連接不通。正確的做法是:在本端不要用QHostAddress::LocalHost或127.0.0.1,而是寫一個確定的、在局域網中設置的靜態IP就行,即代碼像下面那樣:
m_UdpSocket = new QUdpSocket(this);// 不用要localhost,用靜態的IP,綁定到A網卡 m_UdpSocket->bind(HostAddress(“192.168.1.101”),8888); connect(&m_UdpSocket, &QUdpSocket::readyRead, this, &CCmdProcess::readPendingDatagrams);?
總結
以上是生活随笔為你收集整理的localhost、127.0.0.1对网络编程造成不通的说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win10音频服务未响应如何修复
- 下一篇: python虚拟环境Pipenv是什么