客戶端的socket是否需要bind?

2021-07-11 10:23:50 字數 2354 閱讀 7609

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, (structsockaddr *)servaddr,sizeof(structservaddr));

這種設定是因為該server可能有多個網絡卡(多個ip),但不確定client會從哪個網絡卡連線進來。這麼設定可以使bind ip這個過程推遲,直到client端與server建立連線後,server才確定bind 哪個ip.

客戶端——?

1

intconnect ( socket s,conststructsockaddr * name,intnamelen );

tcp socket客戶端通過呼叫connect函式來連線server端,connect()函式的第二個引數就是server端的位址資訊,因為這種情況下只需知道server端

的位址,而客戶通過哪個埠與伺服器建立連線並不重要,socket執行體為你的程式自動選擇乙個未被占用的埠,並通知你的程式資料什麼時候開啟埠,因此無須呼叫bind()。(當然也有特殊情況,linux系統中rlogin命令應當呼叫bind函式繫結乙個未用的保留埠號,還有當客戶端需要用指定的網路裝置介面和埠號進行通訊等等)?

1

intsendto ( socket s ,constvoid* msg,intlen, unsignedintflags,conststructsockaddr * to ,inttolen ) ;

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...