2013-01-07 132 views
0

我是網絡編程的新手,所以我不確定這是否是正確的問題,但我想用C++編寫一個服務器程序(我正在使用Qt)。我使用了「財富服務器」示例,它創建了一個簡單的服務器,您可以通過鍵入服務器顯示的IP地址與客戶端連接。如果我輸入本地主機(127.0.0.1),我可以連接,但服務器說它運行的地址是169.254.253.67,我發現它是另一個本地地址(我也無法連接到它)。我運行服務器,因此它不在本地地址上?在C++中使用非本地IP地址設置服務器(Qt)

下面是我用的例子: http://doc.qt.digia.com/qt/network-fortuneserver.html

+0

我不完全確定你在問什麼,但是如果你使用0.0.0.0作爲監聽地址,服務器將監聽你PC中的所有nics。或者你可以指定外部ipaddress給listen()調用。 – drescherjm

+0

您可以使用以下鏈接來確定ipaddress是哪個主nic:http://qt-project.org/forums/viewthread/1439 – drescherjm

+0

@drescherjm您無法指定外部IP地址。 – EJP

回答

1

服務器實現獲取所有已發現的IP地址的列表,然後找到的第一個非本地IP。否則,它默認使用localhost。如果您看到本地主機地址,則表示網絡中的某些設置不正確,Qt無法確定LAN IP。

正如@drescherjm在評論中建議的那樣,您可以通過0.0.0.0明確監聽所有接口。要看到這個動作,你只需要添加一個行權它設置狀態標籤與ipAddress字符串之前:

// add this to force the socket to listen on all interfaces 
ipAddress = QHostAddress("0.0.0.0").toString(); 
// or if you have a local static ip and want to be explicit 
// ipAddress = QHostAddress("192.168.xxx.xxx").toString(); 

// followed by the already existing line for setting the text 
statusLabel->setText(tr("The server is running on\n\nIP: %1\nport: %2\n\n" 
         "Run the Fortune Client example now.") 
        .arg(ipAddress).arg(tcpServer->serverPort())); 

現在,如果你的網絡設置正確,可以看到一個任何其他計算機運行服務器應用程序應該能夠連接到給定的端口。

+0

感謝您的幫助。我做了更多的研究,發現問題是我連接到路由器,所以我給了一個本地IP地址(如您所說的192.168.1.x),我無法創建一個服務器可以連接到全球的IP。我想我需要設置端口轉發或什麼? – codebreaker

+0

哦,讓WAN客戶端通過你的路由器連接?是的,您需要在路由器上設置端口轉發,以便將特定TCP端口上的流量發送到本地地址。然後,外部客戶端將連接到該端口上的公共IP並路由到本地計算機。 – jdi