当前位置: 首页 > article >正文

【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监听了。

http://www.lryc.cn/news/2418786.html

相关文章:

  • 乔布斯生母不知儿子去世
  • sd敢达g世纪android,SD敢达G世纪 世界/超越世界 安卓模拟器金手指代码亲测有用...
  • 1000BASE-T、1000BASE-TX、1000BASE-X的区别
  • html+css+js网页制作 淘宝首页1个页面带js 大学生HTML5期末作业 Web前端网页制作 html5+css3+js
  • 免费php国外商,转载-四个免费的国外php主机服务
  • 智能设备项目:将程序生成CAB文件 并将CAB部署到PocketPC等仿真设备
  • android应用程序的签名(Signature)
  • 搭建WebService简易框架示例
  • MFC开发之设置菜单项为不可用(ListControl右键菜单其中某项不可用)
  • 锐捷 重启计算机,win7系统锐捷客户端总是提示重启计算机后才能使用的解决方法...
  • Motorola XOOM平板电脑(wingray)刷机方法
  • root了有什么好,手机root好嘛
  • 关于依赖服务或组无法启动解决方案解析
  • 深入探讨 C# 中 [AjaxPro.AjaxMethod] 的使用与优化
  • Git:Commit Message 规范和代码格式校验
  • PPP 和PPPOE协议介绍
  • 基于SSM的家电售后服务+96446(免费领源码)可做计算机毕业设计JAVA、PHP、爬虫、APP、小程序、C#、C++、python、数据可视化、大数据、全套文案
  • [幽默笑话]超漂亮的美女 任你点 [超级好玩](转载)
  • 头的大小是天生的吗_读《狼道》,跟着头狼做强者
  • EgreWing序列帧动画的几种实现思考
  • RabbitMQ入门(五) —— vhost
  • 为什么一些程序频繁发生GC 【转】
  • 如何将经度范围在0至360的栅格数据转换为经度范围为-180至+180
  • 数据库基础知识(总结+摘抄)
  • 前国际货币基金组织(IMF)高级经济学家Andy Jobst将担任Roxe首席货币经济学家
  • ALaN一键压枪脚本【FPS通用】For CS1.5
  • 在VB.Net中创建使用控件数组
  • 在win10里更改启动项、误删分区表恢复,Diskgenius这个软件真的很强大。
  • Socket/TCP/UDP
  • U盘文件夹乱码无法删除的原因及解决方案