bind() 函式的定義與作用——
將一本地位址與一
套介面**。本
函式適用於未連線的資料報或流類
套介面,在
connect()
或listen()
呼叫前使用。 當用
socket()
建立套介面
後,它便存在於乙個名字空間(位址族)中,但並未賦名。bind()
函式通過給乙個
未命名套介面
分配乙個本地名字來為
套介面建立本地**(
主機位址
/埠號)。
服務端——
服務端程序bind埠:基本是必須要做的事情,比如乙個伺服器啟動時(比如freebsd),它會乙個乙個的**眾所周知的埠來提供服務,同樣,
如果bind了乙個埠就表示我這個伺服器會在這個埠提供一些「特殊服務」
。目的是限制了服務端程序建立的socket只接受那些目的地為此ip位址的客戶鏈結;
但是經常看見一些server端的**是這麼寫的(沒有明確寫明bind 的ip): ?
1servaddr.sin_addr.s_addr = htonl(inaddr_any);
之後執行bind函式?
1
bind(sockfd, (
struct
sockaddr *)servaddr,
sizeof
(
struct
servaddr));
這種設定是因為該server可能有多個網絡卡(多個ip),但不確定client會從哪個網絡卡連線進來。這麼設定可以使bind ip這個過程推遲,直到client端與server建立連線後,server才確定bind 哪個ip.
客戶端——?
1
int
connect ( socket s,
const
struct
sockaddr * name,
int
namelen );
tcp socket客戶端通過呼叫connect函式來連線server端,connect()函式的第二個引數就是server端的位址資訊,因為這種情況下只需知道server端
的位址,而客戶通過哪個埠與伺服器建立連線並不重要,socket執行體為你的程式自動選擇乙個未被占用的埠,並通知你的程式資料什麼時候開啟埠,因此無須呼叫bind()。(當然也有特殊情況,linux系統中rlogin命令應當呼叫bind函式繫結乙個未用的保留埠號,還有當客戶端需要用指定的網路裝置介面和埠號進行通訊等等)?
1
int
sendto ( socket s ,
const
void
* msg,
int
len, unsigned
int
flags,
const
struct
sockaddr * to ,
int
tolen ) ;
udp socket客戶端呼叫sendto()函式同樣也只需要填寫
server端的位址資訊(倒數第二個引數),系統依然是自動分配了埠給該socket。
客戶端bind了位址可能帶來的問題:
如果在client端的程式裡,bind()了某個埠(比如 3456)。首先,得考慮這個埠是否被其他的程式占用了(增加了實現的難度和麻煩)。第二,如果client端是hard code了bind這麼乙個埠(3456),那麼在這台電腦上,就只能執行乙個客戶端,因為同乙個埠只能給乙個socket使用。
總結:bind位址的意義在於,可以提前確定埠號——比如:
用於瀏覽網頁服務的80埠,用於ftp服務的21埠等
。server有這個需求,但是client基本沒這個需求。
其他:使用bind函式時,通過將my_addr.sin_port置為0,函式會自動為你選擇乙個未占用的埠
來使用。
bind()函式在成功被呼叫時返回0;出現錯誤時返回"-1"並將errno置為相應的錯誤號。
需要注意的是,在呼叫bind函式時一般不要將埠號置為小於1024的值,因為1到1024是保留埠號,你可以選擇大於1024中的任何乙個沒有被占用的埠號。
參考:
關於Socket通訊客戶端是否需要繫結埠號
參見 無連線的socket的客戶端和服務端以及面向連線socket的服務端 通過呼叫bind函式來配置本地資訊 使用bind函式時,通過將my addr.sin port置為0,函式會自動為你選擇乙個 未占用的埠 來使用。bind 函式在成功被呼叫時返回0 出現錯誤時返回 1 並將errno置為相應...
SOCKET客戶端程式設計
1.建立socket物件 socket建構函式有4個引數,第乙個是family,代表位址家族af net,af net6等,第二個是type,套接字型別sock stream 流套接字 和sock dgram 資料報套接字 import socket s socket.socket socket.a...
訊息佇列的簡單實現(客戶端A,客戶端B)
下面是兩個相互通訊程序的簡單實現,乙個代表客戶端a,乙個代表客戶端b 客戶端a 傳送typeb型別的資料到客戶端b 讀取傳送到客戶端a的typea型別的資料 include include include include include include include include include...