UDP协调特点
1 socket阻塞和非阻塞
阻塞
老王烧水 把水壶放在炉子上 在旁边等着直到水开
优点 事情发送第一时间知道 等待时候进程挂起状态 不占cpu
非阻塞
老王烧水 把水壶放在炉子上 去看电视 每隔一段时间回来看一眼 CPU占用率高
sock默认是阻塞的 接收和发送都是阻塞的
sock设置阻塞
u_long iMode=1;
ioctlsocket(sock,FIONBIO,&iMode);
非阻塞 CPU占用率高 不推荐使用
2 发送和接收缓冲区
缓冲区
创建socket时候 操作系统时候会根据socket分配一个接收缓冲区和发送缓冲区 都是64kb
windows操作系统给每个进程分配4g内存(0-2G 内核空间 2-4G 用户空间)
1 虚拟分配 应用程序实际没有4g空间使用
2 内存分配所见地址是虚假的
操作系统根据端口号找到sock每个sock包含两个缓冲区(接收缓冲区,发送缓冲区)
利用recvfrom函数把缓冲区数据拷贝到自己变量中
发送缓冲区
发送缓冲区大小64KB
阻塞发送:
发送缓冲区不够大 等着 等足够大再发送
非阻塞发送 :
发送缓冲区不够大 还剩多大拷贝多大进去 剩余的给程序处理
sendto返回值int 如果反回值小于发送大小则再发送一次,防止数据丢失
足够大时 阻塞和非阻塞都直接拷贝数据向缓冲区
接收缓冲区
接收缓冲区大小64KB
当数据到达操作系统时候 ,操作系统会根据目的端口号找到之前绑定socket 把数据写入socket对应的缓冲区
当程序调用recvfrom函数时候就是从对应的缓存区接收数据到自己空间
3 UDP协议特点
1 面向非连接,创建socket可以接收任何人发来的数据
2 通讯方式 数据报文的通信方式 不可以拆分(接收也不)
3 传输效率高(和tcp相比)
4 会丢包和出现乱序 但是没有校验和检查 没有解决方法
由于网络复杂产生的UDP对没有任何措施 不负责不在乎是否收到