客戶端的socket是否需要bind?
bind() 函式的定義與作用——
將一本地地址與一套介面捆綁。本函式適用於未連線的資料包或流類套介面,在connect()或listen()呼叫前使用。
當用socket()建立套介面後,它便存在於一個名字空間(地址族)中,但並未賦名。bind()函式通過給一個未命名套介面分配一個本地名字來為套介面建立本地捆綁(主機地址/埠號)。
服務端——
服務端程式bind埠:基本是必須要做的事情,比如一個伺服器啟動時(比如freebsd),它會一個一個的捆綁眾所周知的埠來提供服務,同樣,如果bind了一個埠就表示我這個伺服器會在這個埠提供一些“特殊服務”。
服務端程式bind IP地址:目的是限制了服務端程式建立的socket只接受那些目的地為此IP地址的客戶連結;
但是經常看見一些server端的程式碼是這麼寫的(沒有明確寫明bind 的IP):
1 |
servaddr.sin_addr.s_addr |
1 |
bind(Sockfd, struct
sizeof ( struct
|
這種設定是因為該server可能有多個網路卡(多個IP),但不確定client會從哪個網路卡連線進來。這麼設定可以使bind IP這個過程推遲,直到client端與server建立連線後,server才確定bind 哪個IP.
客戶端——
1 |
int
const
int
|
1 |
int
const
int
int
const
int
|
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中的任何一個沒有被佔用的埠號。
相關文章
- Python socket的客戶端Python客戶端
- C++客戶端程式(socket)C++客戶端
- .net socket.io客戶端使用過程客戶端
- 【windows socket+TCP伺服器客戶端】WindowsTCP伺服器客戶端
- 【windows socket+UDP伺服器客戶端】WindowsUDP伺服器客戶端
- 【windows socket+HTTP伺服器客戶端】WindowsHTTP伺服器客戶端
- 檢測iOS客戶端是否越獄iOS客戶端
- 客戶端與服務端Socket通訊原理詳解客戶端服務端
- Socket最簡單的客戶端與服務端通訊-Java客戶端服務端Java
- 在客戶端儲存對EJB的遠端呼叫是否可行?客戶端
- Linux下簡單的ACE socket客戶端和伺服器端Linux客戶端伺服器
- C# 判斷客戶端是否禁用Cookie的方法C#客戶端Cookie
- Applet是否可以作為JMS的客戶端?APP客戶端
- socket.io 客戶端與伺服器應用客戶端伺服器
- C語言透過socket實現TCP客戶端C語言TCP客戶端
- C#Socket伺服器與客戶端的開發(3)C#伺服器客戶端
- 「完整案例」基於Socket開發TCP傳輸客戶端TCP客戶端
- 如何用Java Socket實現一個簡單的Redis客戶端JavaRedis客戶端
- 基於CMPP2.0的Socket客戶端(Java) - JAVA程式語言客戶端Java
- php原生socket實現客戶端與服務端資料傳輸PHP客戶端服務端
- Laravel後臺作為客戶端,socket.io作為服務端,App或其他作為另一個客戶端Laravel客戶端服務端APP
- socket實現服務端多執行緒,客戶端重複輸入服務端執行緒客戶端
- 《samba搭建win客戶端和linux客戶端的區別》Samba客戶端Linux
- dubbo客戶端客戶端
- Pulsar客戶端客戶端
- mqtt 客戶端MQQT客戶端
- PHP-Socket服務端客戶端傳送接收通訊例項詳解PHP服務端客戶端
- Java Socket程式設計系列(三)開發支援單客戶端訪問的ServerJava程式設計客戶端Server
- MQTTJava客戶端的使用MQQTJava客戶端
- redis客戶端的使用Redis客戶端
- IE客戶客戶端程式開發的利器Bindows客戶端
- 客戶端,服務端客戶端服務端
- 服務端,客戶端服務端客戶端
- Nacos - 客戶端心跳續約及客戶端總結客戶端
- 設定客戶端連線PostgreSQL不需要密碼客戶端SQL密碼
- 記筆記:C# Socket客戶端監聽伺服器端處理方案【同步】筆記C#客戶端伺服器
- python中socket建立客戶連線Python
- 物理DataGuard客戶端無縫切換--客戶端TAF 配置客戶端