udp通讯过程客户端可不可以不bind?如果不bind则服务端如何向其发送信息
关键是recvfrom返回的客户端addrClient是不能作为服务器返回客户端的地址使用的,即在sendto中不能使用由recvfrom返回得到的客户端地址。
楼主将UDP通讯和TCP通讯搞混了,不过说实话这个是很正常的。当初我学的时候没一本书是把网络通信编程写清楚地,只能靠自己摸索。
socket可以理解为通信地址,它由协议,IP和端口组成。在UDP模式中,绑定的目的是要告诉操作系统,当网卡从外部接收到数据包时,操作系统就知道应该把这个数据包交给哪个应用程序。
具体是这样的,网卡总是知道自己的IP是什么,因此网卡接收到网线中的数据包时,会提取数据包的包头,里面含有的IP如果是网卡自己的IP,它就会把该数据包交给操作系统,如果不是就将该数据包丢弃,可以认为操作系统不知道有该数据包。操作系统接收到数据包后,会根据每个数据包包含的端口号,将该数据包发给不同的应用程序。操作系统怎么会知道哪个端口号对应哪个应用程序呢?这个就是要求应用程序使用bind函数,将自己的端口号告诉操作系统。因此,所谓的端口冲突就是指其他应用程序已经通过bind告诉了操作系统该端口被它使用了,因此另外的应用程序就不能使用该端口了,即bind肯定失败!
所以,bind肯定是由接受数据包的应用程序使用的,这样的应用程序就是服务器应用程序,也可以看到我们需要为bind提供IP和端口号。并且,当初我还在疑惑为什么会有一个INADDR_ANY的IP指定,似乎bind根本不需要IP啊,只要端口就可以了。仔细一想才明白,因为一台主机可能会有2个网卡。因此,主机可能会有两个IP,这样bind这个函数允许我们自由指定需要绑定到哪块网卡上的特定端口。也可以不指定,通过INADDR_ANY由操作系统为我们指定。譬如,13端口在第一块网卡中被占用了,我们就可以使用bind明确指定自己的应用程序接收来自第二块网卡13端口的数据包。
UDP编程中作为客户端发送数据时,是不需要指定自己的IP和端口的,因此无需使用bind绑定,直接在sendto指定服务器的IP和端口就可以了。但实际上发送数据时,操作系统还是需要使用客户端机器上的一个IP和端口号的,这个IP和端口号由操作系统指派,譬如在操作系统处理sendto时,它可以指派1005端口给UDP客户端,此时如果有另一个客户程序再使用bind注册该端口,就会失败了。但实际情况大家都知道,UDP数据包的发送是相当快的,这种冲突几乎不存在,因为数据包发送后,即数据包通过网卡发到了网线中,操作系统就认为发送成功了,该端口就会被操作系统收回,标记“未使用”。
总结一下,UDP服务器需要占用一个IP和一个端口号,且是固定的,是在调用了bind函数成功后便确定下来了。UDP客户端也需要使用一个IP和一个端口号,它们都是随机的,这次发送可能是第一块网卡,第二次可能是第二块网卡,端口也如此。发送后,该端口就被操作系统收回,因此客户端无法使用该端口接收来自服务器的数据包。
因此不能使用recvfrom的客户端的端口信息再调用sendto发送给客户端,因为客户端的电脑操作系统根本不会讲该数据包交给客户端应用程序。
以上用比较容易理解的概念介绍了下,其实精确说的话,很多事情不是操作系统做的,而是各种驱动程序完成的。具体怎么修改代码,楼主应该明白了吧,光改服务器端的代码,没用,客户端的代码也要改。这也是为什么UDP是不存在服务器,客户端之说的原因,因为任何一方给另一方发数据包,前提必须使另一方已经通过bind绑定了一个固定端口了。

怎么判断UDP包来自哪个网卡
不管是tcp还是udp,最后都是根据路由表来决定下一跳的,也即决定从哪个网口发出。 在 windows上查看路由表的命令是route print,在 unix/linux下查看的命令route根据你发送包的 destination IP,可以从路由表中找到对应的条目,然后就知道从哪个网口发了,比如我的机器上路由信息是Destination Gateway Genmask Flags Metric RefUse Iface135.252.213.0 0.0.0.0 255.255.255.0 U 20200 eth00.0.0.0 135.252.213.1 0.0.0.0 UG20200 eth0第一条说明如果目的地址是 135.252.213.x ,那么就匹配第一条路由表项,那么是从 eth0 网口发出。第二条全0的那条,就是默认路由,如果无法和任何一条表象匹配,那么就会使用默认路由。 更多细节,这里一时半会也说不清,总之你知道是根据路由表来决定就行了,具体的你去网上查一些跟路由表有关的内容就知道了。

qtudp绑定网卡时出现异常
要检查网络设置。UDP是轻量的、不可靠的、面向数据报的、无连接的协议,通常用于对可靠性要求不高、对速度要求较高的场合。 相对于TCP通信,UDP通信不需要事先建立socket连接,UDP每次发送数据都需要指定目标地址和端口。UDP以数据报传输数据,而不是以连续的数据流。

如何进行指定源地址的UDP报文发送和接收
关于你说的这个问题,我都没有接触过。我读都读不懂这句话的意思。所以不好意思啦。网络是你的好老师,你到上面去学习吧!

UDP如何跨网段传递数据
要使主机A发送的广播包能够被另一网段的主机B收到,那么只需要更改主机A的子网掩码使得与主机B在同一个广播域内,再使用新的广播域的广播地址发送广播包即可。 例如:要使用192.168.23.150发送广播包让192.168.27.135收到,只需要设置192.168.23.150的子网掩码为255.255.0.0,然后再使用广播地址192.168.255.255即可。 特别要指出的是:255.255.255.255是受限广播地址,不能使用该地址发送广播包。
网卡设置多个不同网段ip教程,不同ip跨网段电脑网络互相访问方法

本文由 在线网速测试 整理编辑,转载请注明出处。