Linux網路程式設計 埠繫結問題

2021-09-29 13:13:53 字數 3312 閱讀 2763

所謂繫結(bind)是指別人連線我只能通過我所繫結的埠,相當於,我買了乙個手機,別人要想聯絡我,必須要知道我的手機號碼,這時候,我需要怎麼辦呢?我需要給手機插上**卡,固定乙個**號碼,這樣別人就能通過這個**號碼聯絡我。手機插上**卡,固定乙個**號碼,類似於繫結(bind)的過程,繫結(bind)為了固定乙個埠號,別的網路程式就可以找到這個埠號,找到這個埠號就能找到這個埠號所對應的網路應用程式。

在網路程式設計裡,通常都是在伺服器裡繫結(bind)埠,這並不是說客戶端裡不能繫結(bind)埠,但這裡需要注意的是,乙個網路應用程式只能繫結乙個埠( 乙個套接字只能 繫結乙個埠 )。

乙個套接字不能同時繫結多個埠,如下:

#include

#include

#include

#include

#include

#include

#include

intmain

(int argc,

char

*ar**)

// 初始化本地網路資訊

struct sockaddr_in my_addr;

bzero

(&my_addr,

sizeof

(my_addr));

my_addr.sin_family = af_inet;

my_addr.sin_port =

htons

(8000);

my_addr.sin_addr.s_addr =

htonl

(inaddr_any)

;// 第一次繫結埠8000

int err_log;

err_log =

bind

(sockfd,

(struct sockaddr*

)&my_addr,

sizeof

(my_addr));

if(err_log !=0)

// 又一次繫結別的埠9000, 會繫結失敗

my_addr.sin_port =

htons

(9000);

err_log =

bind

(sockfd,

(struct sockaddr*

)&my_addr,

sizeof

(my_addr));

if(err_log !=0)

close

(sockfd)

;return0;

}

測試結果:

deng@itcast:/mnt/hgfs/linuxhome/code.bak2$ gcc 1.c 

deng@itcast:/mnt/hgfs/linuxhome/code.bak2$ ./a.out

bind 9000: invalid argument

deng@itcast:/mnt/hgfs/linuxhome/code.bak2$

如果客戶端想繫結埠號,一定要呼叫傳送資訊函式之前繫結( bind )埠,因為在傳送資訊函式( sendto, 或 write ),系統會自動給當前網路程式分配乙個隨機埠號,這相當於隨機繫結了乙個埠號,這裡只會分配一次,以後通訊就以這個隨機埠通訊,我們再繫結埠號的話,就會繫結失敗。如果我們放在傳送資訊函式( sendto, 或 write )之前繫結,那樣程式將以我們繫結的埠號傳送資訊,不會再隨機分配乙個埠號。

繫結失敗例子( udp )如下:

#include

#include

#include

#include

#include

#include

#include

intmain

(int argc,

char

*ar**)

struct sockaddr_in dest_addr;

bzero

(&dest_addr,

sizeof

(dest_addr));

dest_addr.sin_family = af_inet;

dest_addr.sin_port =

htons

(8080);

// 伺服器的埠

inet_pton

(af_inet, server_ip,

&dest_addr.sin_addr)

;char send_buf[

512]

="this is for test"

;// 如果前面沒有繫結埠,sendto()系統會隨機分配乙個埠

sendto

(sockfd, send_buf,

strlen

(send_buf),0

,(struct sockaddr*

)&dest_addr,

sizeof

(dest_addr));

//傳送資料

// 初始化本地網路資訊

struct sockaddr_in my_addr;

bzero

(&my_addr,

sizeof

(my_addr));

my_addr.sin_family = af_inet;

my_addr.sin_port =

htons

(8000);

my_addr.sin_addr.s_addr =

htonl

(inaddr_any)

;// sendto()後面繫結埠,繫結失敗

int err_log;

err_log =

bind

(sockfd,

(struct sockaddr*

)&my_addr,

sizeof

(my_addr));

if(err_log !=0)

close

(sockfd)

;return0;

}

測試結果:

deng@itcast:/mnt/hgfs/linuxhome/code.bak2$ gcc 1.c 

deng@itcast:/mnt/hgfs/linuxhome/code.bak2$ ./a.out

bind 8000: invalid argument

deng@itcast:/mnt/hgfs/linuxhome/code.bak2$

Docker 網路之埠繫結

外部訪問容器 容器中可以執行一些網路應用,要讓外部也可以訪問這些應用,可以通過 p 或 p 引數來指定埠對映。p標記時 docker 會隨機對映乙個 49000 49900 的埠到內部容器開放的網路埠。p標記時 則可以指定要對映的埠,並且,在乙個指定埠上只可以繫結乙個容器。支援的格式有 ip hos...

Linux網路基礎 埠

埠 埠 是英文port的意譯,可以認為是裝置與外界通訊交流的出口。埠可分為虛擬埠和物理埠,其中虛擬埠指計算機內部或交換機路由器內的埠,不可見。例如計算機中的80埠 21埠 23埠等。物理埠又稱為介面,是可見埠,計算機背板的rj45網口,交換機路由器集線器等rj45埠。使用rj11插口也屬於物理埠的範...

Linux檢視網路埠

簡單的總結一下前段時間學習linux的成果 檢視 tcp 22 埠是否開啟1 列出所有埠 root demon proc netstat ntlpactive internet connections only servers proto 一 檢視 tcp 22 埠是否開啟 1 列出所有埠 root...