【Socket网络编程】1.bind()和 INADDR_ANY 解析
bind()和 INADDR_ANY 解析
linux網絡編程之UDP通信 http://blog.sina.com.cn/s/blog_c2f250bd0101ii14.html 該博客講了tcp和udp的一些常用參數
bind()解析
當使用socket()創建套接字后,只賦予其所使用的協議,并未分配地址。
在接受其它主機的連接前,必須先調用bind()為套接字分配一個地址。
bind() 一般用于服務器端,將一個套接字與一個套接字地址結構相關聯,比如,關聯一個指定的本地端口和IP地址。
bind()有三個參數:
- sockfd, 表示使用bind函數的套接字描述符
- my_addr, 指向sockaddr結構(用于表示所分配地址)的指針
- addrlen, 用socklen_t字段指定了sockaddr結構的長度
如果發生錯誤,函數返回值為-1,否則為0。
- 原型
int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);
一般接收端要使用bind()。發送端不需使用bind()。
bind() 一般用于服務器(接收)端,將一個套接字與一個套接字地址結構相關聯,比如,關聯一個指定的本地端口和IP地址。
-
作為接收端,當你調用bind()函數綁定IP時使用【INADDR_ANY】,表明接收來自任意IP、任意網卡的發給指定端口的數據。
-
作為發送端,當你調用bind()函數綁定IP時使用【INADDR_ANY】,表明使用網卡號最低的網卡進行發送數據,也就是UDP數據廣播。
-
對于sendto()函數,成功則返回實際傳送出去的字符數,失敗返回-1,錯誤原因存于errno中。
-
對于recvfrom()函數,成功則返回接收到的字符數,失敗則返回-1,錯誤原因存于errno中。 recvfrom()函數不收到數據是不會返回的,而要一直阻塞。若不要阻塞,可用非阻塞模式來接收數據。
-
錯誤碼參考博客 https://blog.csdn.net/qishiai819/article/details/80093659
服務器端 需要bind()綁定ip地址和端口
客戶端 可以不需要bind()綁定ip地址和端口,但是也可以綁定
如果服務器程序就緒后一上來就要發送數據給客戶端,那么服務器就需要知道客戶端的地址信息和端口,那么就不能讓客戶端的地址信息和端口號由客戶端所在操作系統分配,而是要在客戶端程序指定了。
怎么指定?那就是用bind()函數。 https://blog.csdn.net/qq_29344757/article/details/71616748
在多播中,無論是發送還是接收端都必須綁定一個本地地址(需要使用bind()函數),這個地址就是多播通信時處理信息的端口
【socket綁定的ip為 INADDR_ANY 的意義】
https://blog.csdn.net/qq_26399665/article/details/52932755
【INADDR_ANY】 這個宏能夠讓程序員在不知道本機IP地址的情況下,使用它來代表本機所有接口的IP地址。也就是說,使用這個宏作為監聽地址的話,不管本機有多少個接口,socket都會監聽。
舉個例子,假設一個主機有inter1,inter2,,inter3三個接口,如果一個socket綁定了INADDR_ANY的地址和8000的端口,那么,從客戶端過來的一個UDP包到達該主機,不管客戶端connect的是inter1,inter2,inter3中的哪個地址,都會被該socket接收到。如果此時主機還要再建立一個新的socket,使用inter1接口和端口8000,將會失敗,因為這個端口和地址已經被第一個socket監聽了。
總結
以上是生活随笔為你收集整理的【Socket网络编程】1.bind()和 INADDR_ANY 解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Socket网络编程】4.tcp和ud
- 下一篇: 【网络知识】4. linux抓包工具tc