socket 通訊關於bind那點事

2021-08-21 05:26:32 字數 3839 閱讀 8838

通過呼叫bind函式來配置本地資訊

。使用bind函式時,通過將my_addr.sin_port置為0,函式會自動為你選擇乙個未占用的埠來使用。

bind()函式在成功被呼叫時返回0;出現錯誤時返回"-1"並將errno置為相應的錯誤號。需要注意的是,在呼叫bind函式時一般不要將埠號置為小於1024的值,因為1到1024是保留埠號,你可以選擇大於1024中的任何乙個沒有被占用的埠號。

有連線的socket客戶端通過呼叫connect函式

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

1.需要在建連前就知道埠的話,需要 bind 

2.需要通過指定的埠來通訊的話,需要 bind

。 客戶端程序bind埠:

由程序選擇乙個埠去連伺服器,(如果預設情況下,呼叫bind函式時,核心指定的埠是同乙個,那麼執行多個呼叫了bind 的client 程式,會出現埠被占用的錯誤)注意這裡的埠是客戶端的埠。如果不分配就表示交給核心去選擇乙個可用埠。

客戶端程序bind ip位址

:相當於為傳送出去的ip資料報分配了源ip位址,但交給程序分配ip位址的時候(就是這樣寫明了bind ip位址的時候)這個ip位址必須是主機的乙個介面,不能分配乙個不存在的ip。如果不分配就表示由核心根據所用的輸出介面來選擇源ip位址。

一般情況下客戶端是不用呼叫bind函式的,一切都交給核心搞定!

服務端程序bind埠:基本是必須要做的事情,比如乙個伺服器啟動時(比如freebsd),它會乙個乙個的**眾所周知的埠來提供服務,同樣,如果bind了乙個埠就表示我這個伺服器會在這個埠提供一些「特殊服務」。

服務端程序bind ip位址:目的是限制了服務端程序建立的socket只接受那些目的地為此ip位址的客戶鏈結,一般乙個伺服器程式裡都有

servaddr.sin_addr.s_addr = htonl(inaddr_any); // 只是針對ip4,ip6**不太一樣

這樣一句話,意思就是:我不指定客戶端的ip,隨便連,來者不拒!

總之只要你bind時候沒有指定哪一項(置為0),核心會幫你選擇。

果是udp,使用bind以後,可以不使用sendto/recvform函式,而直接用write/read函式了,少去了寫乙個引數。」,這應該是呼叫connect後的效果。

能夠捕獲錯誤。

1.#include

2.#include

3.#include

4.#include

5.#include

6.#include

7.8.

#define maxline 80

9.#define serv_port 8888

10.11.

struct

sockaddr_in

servaddr;

12.13.

void

do_cli

(file *fp,int sockfd,struct sockaddr *pservaddr,socklen_t servlen)

14.25.

#endif

26.27.

while(fgets(sendline,maxline,fp) !=

null)

28.

45. recvline[n] =

0; /* terminate string */

46.fputs(recvline,

stdout);

47. }

48.}

49.50.

intmain

(int argc,char **argv)

51.60.

61./* init servaddr */

62. bzero(&servaddr,

sizeof(servaddr));

63. servaddr.sin_family = af_inet;

64. servaddr.sin_port = htons(serv_port);

65.if(inet_pton(af_inet,argv[

1],&servaddr.sin_addr) <=

0)66.

70. sockfd = socket(af_inet,sock_dgram,

0);71. do_cli(

stdin,sockfd,(struct sockaddr *)&servaddr,

sizeof(servaddr));

72.return

0;

73.}

-dudp_connect udpclient.c

abcd

write over

read error: connection refused

tcpdump: listening on eth0, link-type en10mb (ethernet), capture size 65535 bytes

21:49:40.300735 ip (tos 0x0, ttl 64, id 20973, offset 0, flags [df], proto udp (17), length 33)

localhost.42774 > localhost.8888: udp, length 5

21:49:40.303965 ip (tos 0x0, ttl 64, id 22696, offset 0, flags [none], proto icmp (1), length 56)

localhost > localhost: icmp localhost udp port 8888 unreachable, length 36

ip (tos 0x0, ttl 64, id 20973, offset 0, flags [df], proto udp (17), length 33)

localhost.42774 > localhost.8888: udp, length 5

abcd

write over

tcpdump: listening on eth0, link-type en10mb (ethernet), capture size 65535 bytes

22:14:23.863178 ip (tos 0x0, ttl 64, id 0, offset 0, flags [df], proto udp (17), length 33)

localhost.46642 > localhost.8888: udp, length 5

22:14:23.864000 ip (tos 0x0, ttl 64, id 22730, offset 0, flags [none], proto icmp (1), length 56)

localhost > localhost: icmp localhost udp port 8888 unreachable, length 36

ip (tos 0x0, ttl 64, id 0, offset 0, flags [df], proto udp (17), length 33)

localhost.46642 > localhost.8888: udp, length 5

參考資料2中提到乙個程式先用udp監聽在機器b的9000上,同時用udp connect到另一台機器a的8000埠,結果發現使用其他機器往機器b的9000埠傳送資料時,它不會做出響應。

udp/

udp.pdf

socket 通訊關於bind那點事

名稱 bind 把名字和套接字相關聯 使用格式 include include intbind intsockfd const struct sockaddr addr socklen t addrlen 功能描述 當用socket 函式建立套接字以後,套接字在命名空間 網路位址族 中存在,但沒有任...

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