为什么服务器需要绑定操作,客户端不需要绑定操作?
来源:互联网 发布:linux ping网络不可达 编辑:程序博客网 时间:2024/06/03 18:32
结论:
1、采用TCP通信时,客户端不需要bind()他自己的IP和端口号,而服务器必须要bind()自己本机的IP和端口号;
2、若采用UDP通信时(这里是有客户端和服务器之分才这么说的,若是指定特定端口的UDP对等通信则不一样了),客户端也可以不需要bind()他自己的IP和端口号,而服务器需要bind自己IP地址和端口号;
原因:
1、
因为服务器是时时在监听有没有客户端的连接,如果服务器不绑定IP和端口的话,客户端上线的时候怎么连到服务器呢,所以服务器要绑定IP和端口,而客户端就不需要了,客户端上线是主动向服务器发出请求的,因为服务器已经绑定了IP和端口,所以客户端上线的就向这个IP和端口发出请求,这时因为客户开始发数据了(发上线请求),系统就给客户端分配一个随机端口,这个端口和客户端的IP会随着上线请求一起发给服务器,服务收到上线请求后就可以从中获起发此请求的客户的IP和端口,接下来服务器就可以利用获起的IP和端口给客户端回应消息了。
2、采用UDP通信
1)若有客户端和服务器之分的程序,创建sock后即可在该socket上用recvfrom/sendto方法发送接受数据了,因为客户端只需要用sendto发送数据到指定的地址,当然若是bind了,程序也没什么问题,区别就是系统用默认自动bind()指定你自己的socket参数地址(特别是在指定特定端口的UDP对等通信)只是这种情况没有这样用的。
那UDP服务器是怎么知道客户端的IP地址和UDP端口?
一般来说有两种方式:
一种是客户端发消息显式地告诉服务器IP地址和端口,消息内容就包括IP地址和UDP端口。
另外一种就是隐式的,服务器从收到的包的头部中得到包的源IP地址和端口。
2)若是没有客户端和服务器之分的程序,即自己指定特定端口的UDP对等通信,则客户端和服务器都需要bind()IP地址和端口了。
通常udp服务端根本不需要知道客户端的socket,它直接建立一个socket用于发送即可,udp通信的关键只在于IP和端口。
多个客户端如果需要点到点分发,必须给服务端socket循环设置每个客户端的IP并发出,但更常用的是广播分发,服务端socket设定一个X.X.X.255的广播地址并始终向它发送,每个客户端建立的socket只需要绑定这个广播地址便可以收到。
客户端用不用bind 的区别
1.需要在建连前就知道端口的话,需要
2.需要通过指定的端口来通讯的话,需要
具体到上面那两个程序,本来用的是TCP,客户端就不用绑定端口了,绑定之后只能运行一个client的程序,是属于自己程序中人为设定的障碍,而从服务器那边得到的客户机连接端口号(是系统自动分配的)与这边客户机绑定的端口号根本是不相关的,所以客户绑定也就失去了意义。
- 为什么服务器需要绑定操作,客户端不需要绑定操作?
- 为什么客户端不需要绑定IP地址和端口号
- 服务器为什么需要异步操作
- comboBox绑定数据库操作
- comboBox绑定数据库操作
- sqlite 绑定数据操作
- 双网卡绑定操作
- stm32_011_stm32位绑定操作
- C# 绑定dataGridView列操作
- C#后期绑定操作Excel
- 位操作实现权限绑定
- 简便操作WPF数据绑定
- C#后期绑定操作Excel
- datagridview 绑定后的操作
- Hibernate的绑定变量操作
- 【控件操作】DataGridView绑定数据源
- [Zigbee]绑定操作的时间
- GridView 操作事件绑定技巧,单元格属性绑定指定值
- Hbase scan通过rowkey条件查询
- MySQL 5.7 windows 免安装版 配置文件 案例
- HttpClient上传Post请求和JSON请
- 【NOIp 2017】小凯的疑惑(置顶)
- java 对象的this引用
- 为什么服务器需要绑定操作,客户端不需要绑定操作?
- Nginx之代理和负载均衡
- Sublime text3 连接sftp/ftp(远程服务器)
- 《Interstellar》
- 11.27 日记
- 树莓派
- SSM框架Web数据流
- oracle和hibernate的一对一(OneToOne),一对多(OneToMany),(详细图解)
- WEB前端 -- CSS部分样式