簡體   English   中英

為什么我們在C中的套接字編程中需要服務器的ip地址

[英]Why do we require the ip address of server in itself in socket programming in C

我是套接字編程的新手。 在編寫一個簡單的客戶端 - 服務器應用程序時,我發現我們將服務器綁定到服務器地址結構。

// define the server address
struct sockaddr_in server_address;
server_address.sin_family = AF_INET;
server_address.sin_port = htons(9002);
server_address.sin_addr.s_addr =  INADDR_ANY; //focus on this line --- line 4

// bind the socket to our specified IP and port
bind(server_socket, (struct sockaddr*) &server_address, sizeof(server_address));

如代碼所示,為什么我們需要第4行? 我們知道服務器套接字將綁定在服務器machine-ip(本身)上,它無法綁定到任何其他ip。 在這種情況下, INADDR_ANY (或任何其他ip?)的意義是什么?

現在想象一下服務器。 而且,服務器有3個網卡。 1專用於生產(專用於應用程序),另一個用於備份(因此在備份期間PROD NIC網絡不會被卡住)和第三個用於維護(無法訪問外部世界且僅在內部使用的一個) ,供管理員訪問機器)。

你在里面運行了一個ssh守護進程。 現在服務器不能通過外部世界的ssh訪問(即從PROD NIC),因此您無法將ssh綁定到NIC1 IP,也無法將其綁定到0.0.0.0。 NIC3專用於管理目的,您將ssh守護程序綁定到其IP。

有道理,不是嗎?

這同樣適用於備份和主應用程序。 通常主應用程序不能從LAN訪問,因此它必須綁定到NIC1 IP。 並且備份調度程序偵聽器不可能由來自外部的連接觸發,因此您將它綁定到NIC的IP,無論哪個連接到bkups服務器(NIC2)。

通常本地數據庫僅限於環回,因此無法通過任何NIC訪問它們。 一般服務通常可以通過服務器上安裝的任何NICS獲得(想想httpd,DNS @LAN等)。

這就是你必須綁定的原因 - 你必須選擇如何訪問套接字:通過環回,通過任何一個NIC或通過任何NIC / LO。

主機可以安裝多個網絡接口 (即,一次連接到多個網絡),並且至少有一個與每個接口相關聯的IP地址(例如,考慮IP別名 )。

INADDR_ANY將套接字綁定到所有可用接口。 否則,您必須指定要綁定的特定接口的IP地址。

它將綁定到您的機器/設備中的所有可用接口。 從這里解釋:

IP地址INADDR_ANY

在項目1中編寫簡單FTP服務器時,可能會將偵聽套接字綁定到特殊IP地址INADDR_ANY。 這使您的程序可以在不知道運行它的機器的IP地址的情況下工作,或者在具有多個網絡接口的機器的情況下,它允許您的服務器接收發往任何接口的數據包。 實際上,INADDR_ANY的語義更復雜且更復雜。

在模擬器中,INADDR_ANY具有以下語義:接收時,綁定到此地址的套接字接收來自所有接口的數據包。 例如,假設主機具有接口0,1和2.如果此主機上的UDP套接字使用INADDR_ANY和udp端口8000綁定,則套接字將接收到達接口0,1或者端口8000的所有數據包,或者2.如果第二個套接字嘗試綁定到接口1上的端口8000,則綁定將失敗,因為第一個套接字已經“擁有”該端口/接口。

發送時,與INADDR_ANY綁定的套接字綁定到默認IP地址,即接口編號最小的IP地址。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM