第十二章 UDP套接字

12.1 前言

上一章讲述了TCP通信方式,它是基于流的面向连接的网络通信。UDP是IP协议上的另一种传输协议。

TCP和UDP都是端到端的通信协议,都处于TCP/IP网络模型的第三层(传输层)。

它和TCP的区别是:

TCP UDP 解释
基于流 基于报文  
有连接 无连接  
有保障 无保障  
效率低 效率高  
适用稳定传输场合 适合允许报文丢失的场合  

12.2 创建UDP socket

int sockfd = socket(AF_INET, SOCK_DGRAM, 0);

12.2 绑定地址

绑定地址和TCP一样

12.3 发送和接收

调用的接口和TCP不一样,行为不同。TCP的发送会发生粘包情况,而UDP不会。TCP发送认为是可靠的,而UDP的发送可能会发生丢失和乱序。

UDP的发送大部分时候使用sendto,因为send函数没有提供目标地址。如果UDP socket调用了connect函数,也可以使用send函数。

12.4 广播和多播(组播)

由于UDP没有连接,所以可以支持广播和多播。

12.5 关闭socket

使用close

注意:

  • UDP也可以调用connect函数,但是connect函数只是让udp socket保存默认的发送地址,以便可以简单的调用send函数来发送数据。

  • UDP的数据是基于报文的,客户端调用一次send,产生一个UDP报文,接收一次只能接收一个报文。

  • 如果recv时,程序提供的缓冲区小于UDP报文长度,那么会导致数据丢失。如何得到数据报文的长度???UDP报文不要超过MTU(1400)

  • 广播时,发送端做额外设置,允许发送广播,接收端还是默认处理接口。允许发送广播socket,也可以接收数据。

  • 组播,发送端不需要额外设置,只需要发送地址改成组播地址即可。接收端加入组。

网络编程 UDP套接字的更多相关文章

  1. <unix网络编程>UDP套接字编程

    典型的UDP客户/服务器程序的函数调用如下: 1.缓冲区 发送缓冲区用虚线表示,任何UDP套接字都有发送缓冲区,不过该缓冲区仅能表示写到该套接字的UDP数据报的上限.如果应用进程写一个大于套接字缓冲区 ...

  2. UNIX网络编程——原始套接字(dos攻击)

    原始套接字(SOCK_RAW).应用原始套接字,我们可以编写出由TCP和UDP套接字不能够实现的功能. 注意原始套接字只能够由有 root权限的人创建. 可以参考前面的博客<<UNIX网络 ...

  3. UNIX网络编程——原始套接字的魔力【续】

    如何从链路层直接发送数据帧 上一篇里面提到的是从链路层"收发"数据,该篇是从链路层发送数据帧. 上一节我们主要研究了如何从链路层直接接收数据帧,可以通过bind函数来将原始套接字绑 ...

  4. TCP/IP网络编程之套接字类型与协议设置

    套接字与协议 如果相隔很远的两人要进行通话,必须先决定对话方式.如果一方使用电话,另一方也必须使用电话,而不是书信.可以说,电话就是两人对话的协议.协议是对话中使用的通信规则,扩展到计算机领域可整理为 ...

  5. TCP/IP网络编程之网络编程和套接字

    网络编程和套接字 网络编程又称为套接字编程,就是编写一段程序,使得两台连网的计算机彼此之间可以交换数据.那么,这两台计算机用什么传输数据呢?首先,需要物理连接,将一台台独立的计算机通过物理线路连接在一 ...

  6. Linux网络编程——原始套接字实例:MAC 头部报文分析

    通过<Linux网络编程——原始套接字编程>得知,我们可以通过原始套接字以及 recvfrom( ) 可以获取链路层的数据包,那我们接收的链路层数据包到底长什么样的呢? 链路层封包格式 M ...

  7. 【TCP/IP网络编程】:01理解网络编程和套接字

    1.网络编程和套接字 网络编程与C语言中的printf函数和scanf函数以及文件的输入输出类似,本质上也是一种基于I/O的编程方法.之所以这么说,是因为网络编程大多是基于套接字(socket,网络数 ...

  8. 初探网络编程--TCP套接字编程演示

    今天看了一下<计算机网络:自顶向下方法>,也就是计算机网络的教材的应用层一章,决定实现以下后面的Java C/S应用程序的例子,用来演示TCP和UDP套接字编程. 程序流程如下: 1.一台 ...

  9. 19 网络编程--Socket 套接字方法

    1.Socket(也称套接字)介绍 socket这个东东干的事情,就是帮你把tcp/ip协议层的各种数据封装啦.数据发送.接收等通过代码已经给你封装好了 ,你只需要调用几行代码,就可以给别的机器发消息 ...

随机推荐

  1. [题解] Atcoder Regular Contest ARC 148 A B C E 题解

    点我看题 题目质量一言难尽(至少对我来说 所以我不写D的题解了 A - mod M 发现如果把M选成2,就可以把答案压到至多2.所以答案只能是1或2,只要判断答案能不能是1即可.如果答案是1,那么M必 ...

  2. C++面向对象编程之复合、委托和继承

    1.复合,表示has a template <typename T> calss A{ protected: B<T> c; } 这里表示 A 里面有一个 B,A 可以调用 B ...

  3. MasaFramework -- 异常处理

    前言 在程序设计中,我们会遇到各种各样的异常问题,一个异常处理不仅仅可以帮助开发者快速的定位问题,也可以给用户更好的使用体验,那么我们在AspNetCore项目中如何捕获以及处理异常呢? 而对应Asp ...

  4. Hbase之API基本操作

    API之框架 private static Admin admin = null; private static Connection connection = null; private stati ...

  5. Nginx通用优化示例

    user nginx; worker_processes auto; #worket_cpu_affinity auto; error_log /var/log/nginx/error.log war ...

  6. win10安装pip

    Windows如何安装pip?请看下面方法: 1.搜索pip 2.点击下载文件. 3.下载压缩包 6.解压到桌面. 7.进入解压目录,按住Shift点击右键,选择打开powershell 8.执行py ...

  7. 【JavaSE】抽象类、接口

    接口的诞生 接口其实就是一种标准一种规范. 先从生活中的例子讲起,理解含义和概念后,再去理解程序会更容易理解一些. 生活中接口无处不在,比如著名的USB接口,大家可以试想一下,如果没有像USB这种统一 ...

  8. raid 5搭建部署

    raid 5搭建部署 软raid与备份 1.用四块磁盘做实验,三块盘搭建raid阵列组,有一块当作备份可以使用raid 5来搭建三块磁盘的阵列组 创建命令如下: [root@xiaohaoge ~]# ...

  9. Python基础部分:9、数据的类型和内置方法

    目录 一.数据类型内置方法理论 1.什么是数据内置方法 2.如何调用数据内置方法 二.整型(int)内置方法与操作 1.类型转换 2.进制数转换 三.浮点型(float)内置方法与操作 1.类型转换 ...

  10. EntityFramework介绍

    首先我们说明一下ORM是什么. 微软官方提供的ORM工具,ORM让开发人员节省数据库访问的代码时间,将更多的时间放到业务逻辑层代码上.开发人员使用Linq语言,对数据库操作如同操作Object对象 一 ...