LINUX UDP SOCKET
01
UDP号绑定会报错吗?
会的,提示Address is using,本地的没有区别
UDP不需要发起链接,不知道是不是连接成功
client的IP地址和端口号不正确都不会报错,包一直向外抛
但是通过抓包工具,IP不正确
可以得到network unreachable的网关回答
端口不正确
可以得到对方主机拒绝端口的回答(图中端口错了)
运行终止后再次绑定端口号能否成功?
可以!因为UDP是未知状态下的抛送包,TCP下是不行的,要等握手链接告别表示已经空了可以断线,之后才能绑上,而UDP没有链接,只有包。
阻塞接通UDP包
在Server端kill掉进程
客户端没有任何反应
在Client端kill掉进程
服务端没有任何反应
总结:UDP链接不锁死端口号(没有握手过程不需要确认告别),kill掉任何一段另一端都没有反应(收不到信号)
02
阻塞方法和非阻塞方法没有区别
因为UDP对网络的状态是未知的,想获得报错信息,只能在程序里想办法抓到网关或者对方主机的refused包
非阻塞方法接通socket
03
阻塞方法一次读取20字节
读取到的内容只有20字节,每次都是前20字节
阻塞方法发送2字节//没有意义
每次都是前两字节
04
非阻塞方法法20字节
效果同阻塞方法
非阻塞方法发送2字节//没有意义
效果同阻塞方法
为什么UDP中缓冲区长度没有意义?
在UDP中调整缓冲区来保证字节数本身就是没有价值的
因为UDP的包本身不保证连续,不保证能够送达(送不到直接回信refused)有可能是缓冲区满,有可能丢包了。因此每个包就是一个完整的数据
05
Server端和Client端都具备双路收发
其他问题
UDP能否只绑定一个IP?
可以的,我所有的代码都是绑定第二个IP(一般第一个是回环IP,第二个是ens33通外网的IP,直接使用之前写的GET IP LIST即可
UDP Server之间能否收发数据?
可以,UDP不需要设置监听链接,没有accept和connect关系,Server和Client之间是等位的,两个Server之间也可以传递UDP包
UDP中的client端口号可以绑定吗?
可以绑定,但是没有绑定的意义。链接都不存在,指定端口也不能接听到什么内容。
UDP的端口号netstat能不能看到?
看不到的。试过无数次了,只能通过抓包工具看包的来源和去向(IP:PORT)
Client端是否一定需要connect?不使用connect的情况下有什么区别?
对于Server端来说没有区别,对于client端来说connect在自己主机给sockfd固定一个addr,这样可以直接写recv和send而不用每次都执行recvfrom和sendto。但是只影响到内核中的sockfd文件和地址族绑定,UDP协议还是UDP协议,收发包没有任何区别
持续写能否写满缓冲区?阻塞和非阻塞有区别吗?
有区别!阻塞的方法写满了缓冲区直接报错回弹了,非阻塞的一直发包,另一边缓冲区满了包直接扔了不读
UDP收发缓冲区可以设置?
可以的,setsockopt,但是没有任何价值,UDP的包本身是不连续的,除非为了接受一个硕大无比的UDP包,才去调整缓冲区,但是UDP本身丢包是不知道的,UDP包也没有长度指示符。