![](/img/trans.png)
[英]In socket programming in c,why to specify the socket address in server program?
[英]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地址。
它將綁定到您的機器/設備中的所有可用接口。 從這里解釋:
在項目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.