2016-02-22 26 views
-1

我已經用Linux(Cent OS 7.0)和C++編寫了一個簡單的程序。它是一個非常小的服務器,它將一串字符發送回客戶端。但我的問題是,我不知道如何使用IP地址訪問該服務器?如何使.cpp文件充當可訪問的服務器

我用Linux的套接字接口(伯克利),並在其中定義地址段,我的代碼執行以下操作:

serverObject. 
      sin_family = AF_INET; 
    serverObject.sin_addr. 
      s_addr = htonl(INADDR_ANY); 
    serverObject. 
      sin_port = htonl(portNumber); 

我使用INADDR_ANY因爲這是在它的定義界定爲我的服務器的地址:

/* Address to accept any incoming messages. */ 

現在,我該如何運行服務器,然後使用我的簡單客戶端程序向它發送請求。我的簡單客戶程序接受一個I​​P地址作爲目的地址,這個地址應該是註定要到達服務器的地址。那我應該怎麼把它聯繫起來呢?

+0

要通過網絡連接兩個應用程序,您需要目標的IP和端口。您的服務器需要爲您提供這些數據,以及連接到它們的客戶端。你的問題是關於客戶端如何知道服務器IP /端口? –

+0

我的問題是,我如何找到我的服務器?並將客戶的請求發送給它?該端口已在服務器和客戶端中使用。更重要的是,我想知道當我使用'INADDR_ANY'時應該使用什麼地址。 –

+0

請看Steven的'Unix Network Programming'的示例代碼,或者'man select_tut'。 Google爲Steven的示例代碼。 –

回答

2

INADDR_ANY用於指定系統中所有活動的網絡接口應綁定到。因此,如果您連接到多個網絡,則可以與來自所有網絡的連接進行通信。儘管如此,大多數系統通常只有一個系統,這仍然可以說,如果綁定到該接口的IP發生改變,您仍然會綁定到該接口。

所以,一旦你指定INADDR_ANY,需要根據以下規則來啓動連接:

  1. 如果你從同一臺物理機器的連接,最簡單的事情是使用loopback接口( 127.0.0.1)。但是,你仍然可以做(2)。
  2. 如果要從另一臺機器連接,則需要從該機器中選擇服務器的可訪問IP地址。如上所述,如果您的服務器只連接到一個網絡,則這將僅僅是服務器的IP地址。在內部網絡中,這通常是192.168.x.y或10.0.x.y —之類的東西,但並不一定。
  3. 如果您從不同的網絡連接使用網關訪問您的服務器,則需要在相關路由器中設置端口轉發,以便當它們接收到端口X的連接時,它們將知道內部傳輸它到你的服務器。
1

作爲服務器程序員,您決定要偵聽的端口,但不是地址。

互聯網地址是由您的互聯網提供商提供,或127.0.0.1在您自己的機器上測試。

互聯網上有大量的網頁,提供工具告訴你你目前的公共地址(搜索什麼是我的IP)。大多數「家庭」互聯網路由器實現NAT:他們有一個互聯網地址,並將它們映射到許多設備,這些設備攜帶要更改的端口號(您的端口80成爲端口(例如)2345以外)。爲了讓您的家庭以外的客戶端訪問您的服務器,您需要配置您的路由器以映射服務器端口,例如您的公共端口80映射到您的服務器端口80.

這樣說的話,您應該能夠通過地址和端口將您的客戶端連接到您的服務器。

如果您想使用名稱(example.org)而不是IP(93.184.216.34),則使用域名服務器。但那是另一個話題。

+0

感謝您的回答,關於服務器的地址,我知道,但我應該指定INADDR_ANY的作用域。 –