2013-04-11 93 views
2

在c中的套接字編程中,爲什麼要在服務器程序中指定套接字地址? 我無法理解爲什麼在服務器程序中指定套接字地址,因爲我們在客戶端程序中指定的套接字地址,需要在服務器程序中指定什麼。在c中的套接字編程中,爲什麼要在服務器程序中指定套接字地址?

下面是代碼:

bzero((char *)&serv_addr,sizeof(serv_addr)); 

serv_addr.sin_family=AF_INET; 

serv_addr.sin_addr.s_addr=inet_addr(argv[1]); 

serv_addr.sin_port=htons(atoi(argv[2])); 
+0

* Posix *(或BSD套接字)中的套接字編程多於* C *中的套接字編程;我建議讀一本關於Posix網絡編程的好書。如果在Linux上,請閱讀http://advancedlinuxprogramming.com/ – 2013-04-11 11:22:49

回答

1

你不,你可以使用INADDR_ANY而不是真正的地址,但是當你有你的機器上有多個網絡接口,它可以很有用。

3

大多數服務器不顯式指定套接字地址,他們使用INADDR_ANY(如@ybo地址)。

服務器可能指定地址的原因是控制客戶端到達哪個接口。例如,您可以綁定到地址127.0.0.1(localhost)以確保客戶端僅在本地計算機上運行,​​從而降低與遠程連接相關的安全風險。您也可以顯式綁定到外部端口,以便更好地使用沙箱遠程客戶端。

0

您的計算機可能有很多IP地址。 (即使127.0.0.1可以被認爲是一個獨立於你的「真實」IP)。在服務器套接字上,你可以選擇你正在「監聽」的這些地址中的哪一個。按照上面的例子,我認爲將服務器套接字綁定到127.0.0.1意味着您只能在本地連接到該服務器程序。

1

其實相同的答案休息,但換句話說:

服務器通常只使用1個公網IP地址。並且還有一個或多個內部IP地址(如localhost 127.0.0.1和lan 192.168.0.1)。

但一臺服務器輕鬆也可以有多個公網IP地址。

服務器甚至需要多個公共IP地址,如果它將在端口443上託管多個HTTPS證書,因爲每個服務器都綁定到特定的IP地址。

收聽時,您可以監聽1個特定的IP地址,並從其他IP地址從而則會忽略流量。您甚至可以讓其他應用程序在其他IP地址上使用相同的端口號。

如果出於安全考慮,您只希望應用程序從本地主機連接(例如,客戶端和服務器在同一臺機器上),你最好只在127.0.0.1聽,而不是所有IP的。