socket 通訊關於bind那點事

2021-07-17 03:25:56 字數 1618 閱讀 9158

名稱

bind()

把名字和套接字相關聯

使用格式

#include

#include

intbind(

intsockfd

, const struct sockaddr

*addr

,socklen_t

*addrlen

);功能描述

當用socket()函式建立套接字以後,套接字在命名空間(網路位址族)中存在,但沒有任何位址給它賦值。bind()把用addr指定的位址賦值給用檔案描述符代表的套接字sockfdaddrlen指定了以addr所指向的位址結構體的位元組長度。一般來說,該操作稱為「給套接字命名」。

通常,在乙個sock_stream套接字接收連線之前,必須通過bind()函式用本地位址為套接字命名。

備註:

呼叫bind()函式之後,為socket()函式建立的套接字關聯乙個相應位址,傳送到這個位址的資料可以通過該套接字讀取與使用。

備註:

bind()函式並不是總是需要呼叫的,只有使用者程序想與乙個具體的位址或埠相關聯的時候才需要呼叫這個函式。如果使用者程序沒有這個需要,那麼程式可以依賴核心的自動的選址機制來完成自動位址選擇,而不需要呼叫bind()函式,同時也避免不必要的複雜度。在一般情況下,對於伺服器程序問題需要呼叫bind()函式,對於客戶程序則不需要呼叫bind()函式。

傳送給引數addr的實際結構依賴於網路協議族。sockaddr結構定義為如下格式:

[plain]view plain

copy

print?

struct sockaddr   

該結構的唯一目的是強制結構指標在addr引數中傳送,以避免編譯過程出現warning。參看如下例項。

返回值成功,返回0;出錯,返回-1,相應地設定全域性變數errno。

錯誤eaccess

位址空間受保護,使用者不具有超級使用者的許可權。

eaddrinuse

給定的位址正被使用。

例項:下面的例項演示了如何在unix域中繫結流套接字,並接收連線。

[plain]view plain

copy

print?

#include 

#include 

#include 

#include 

#include 

#define my_sock_path "/somepath"  

#define listen_backlog 50  

#define handle_error(msg) \  

do  while (0)  

int  

main(int argc, char *argv)  

socket 通訊關於bind那點事

通過呼叫bind函式來配置本地資訊 使用bind函式時,通過將my addr.sin port置為0,函式會自動為你選擇乙個未占用的埠來使用。bind 函式在成功被呼叫時返回0 出現錯誤時返回 1 並將errno置為相應的錯誤號。需要注意的是,在呼叫bind函式時一般不要將埠號置為小於1024的值,...

關於socket通訊的雜談

用mfc寫了個跟印表機相關的小應用 由於需要接受網路服務端傳來的資料 所以就用到了socket通訊 socket 建立 連線 傳送 接收 關閉 其他都還好 只是接收資料的時候 會出現亂碼 出現的情況是 當有中文字元出現的時候就會出現,這是因為每個中文字元佔兩個位元組 所以接收資料的時候要乙個位元組乙...

socket程式設計bind問題 兩個bind

在windows下的tcp通訊問題,遇到這樣的問題 不存在從 std bind false,void,socket sockaddr unsignet int 到 int 的適當轉換函式。最近在做windows下的tcp通訊,查了一下,原因是在c 11中增加了 std bind fp f,bound...