UDP实例(只区分发送端和接受端,不分客户端和服务器端)

合集下载

UDP编程初次尝试

UDP编程初次尝试

之前的学习中都是采用的TCP的socket进行网络编程,在本周的作业中开始学习UDP 的socket编程。

在网络传输协议中,TCP协议提供了一种可靠的,复杂的,面向连接的数据流(SOCK_STREAM)传输服务,它通过三次握手过程建立连接。

TCP有一种“重传确认”机制,即接收端收到数据后要发出一个肯定确认的信号,发送端如果收到接收端肯定确认的信号,就会继续发送其他的数据,如果没有,则会重新发送。

相对而言,UDP协议则是一种无连接的,不可靠的数据报(SOCK_DGRAM)传输服务。

使用UDP套接口不用建立连接,服务端在调用socket()生成一个套接字并调用bind()函数绑定端口之后就可以进行通信了,客户端在用socket()生成一个套接字后就可以向服务器端发送和接收数据了。

1,首先编写UDP sockete程序udp_server1,udp_client1。

cpp,与TCP进行对比,得到两者异同。

熟悉掌握基于udp协议的socket编程。

1.1,编写测试程序udp_server1,运行后绑定某个UDP端口号。

并且熟悉其状态。

1.2,编写测试程序udp_client1,运行时带入服务器端IP地址端口号,对其分析。

Tips:1因为udp是不面向连接的,所以不需要等待客户端的connect,而直接进入等待数据收发阶段。

2将udp_server绑定已经使用的端口出错情况分析。

我在一个终端上运行./udp_server12000后,再次开启了另一个终端,执行相同的操作,提示错误为Bind::Address already in use。

说明如果服务器端UDP端口号已经被使用,则会出错。

这点和tcp是一样的。

同时,如果在一个终端上运行tcp socket程序绑定端口2000,同时运行./udp_server12000时,两者都不报错,udp端口和tcp端口指定同一个是并不冲突。

3,udp协议不是面向连接的,所以并不需要先服务器发起连接。

UDP协议详解

UDP协议详解

UDP协议详解UDP(User Datagram Protocol)是一种无连接的传输层协议,它提供了一种简单的、不可靠的数据传输服务。

与TCP协议相比,UDP协议不提供数据完整性、可靠性和流量控制等特性,但由于其简单性和低开销,UDP协议在一些特定的应用场景中被广泛使用。

本文将详细解释UDP协议的工作原理、特点和使用场景。

一、UDP协议的工作原理UDP协议使用简单的数据报文形式进行通信。

数据报文是由一个UDP首部和应用层数据组成的,UDP首部包含了源端口号、目的端口号、长度和校验和等字段。

UDP协议不需要建立连接,数据报文可以直接发送给目的主机。

UDP协议的工作流程如下:1. 发送端将应用层数据传递给UDP协议。

2. UDP协议在数据报文中添加首部信息。

3. UDP协议将数据报文发送给目的主机。

4. 接收端的UDP协议从数据报文中提取应用层数据并传递给应用程序。

二、UDP协议的特点1. 无连接:UDP协议不需要建立连接,发送端和接收端之间的通信是无状态的。

2. 不可靠:UDP协议不提供数据的可靠传输,数据报文可能会丢失、重复或乱序。

3. 简单高效:UDP协议的首部开销小,处理速度快。

4. 支持一对一、一对多和多对多的通信模式。

5. 不提供拥塞控制和流量控制等功能。

三、UDP协议的使用场景1. 实时应用:UDP协议适用于实时应用,如音频、视频和实时游戏。

由于UDP协议的低延迟和简单性,可以实现实时数据的快速传输。

2. DNS服务:域名系统(DNS)使用UDP协议进行域名解析。

由于DNS查询通常是短小的请求和响应,使用UDP协议可以减少开销。

3. 广播和多播:UDP协议支持广播和多播,可以将数据报文发送给多个主机,适用于组播视频、在线会议等应用。

4. SNMP协议:简单网络管理协议(SNMP)使用UDP协议进行网络设备的管理和监控。

5. TFTP协议:简单文件传输协议(TFTP)使用UDP协议进行文件的传输。

什么是木马,如何防治

什么是木马,如何防治

什么是木马,如何防治?木马(Trojan)这个名字来源于古希腊传说,它是指通过一段特定的程序(木马程序)来控制另一台计算机。

木马通常有两个可执行程序:一个是客户端,即控制端,另一个是服务端,即被控制端。

木马的设计者为了防止木马被发现,而采用多种手段隐藏木马。

木马的服务一旦运行并被控制端连接,其控制端将享有服务端的大部分操作权限,例如给计算机增加口令,浏览、移动、复制、删除文件,修改注册表,更改计算机配置等。

随着病毒编写技术的发展,木马程序对用户的威胁越来越大,尤其是一些木马程序采用了极其狡猾的手段来隐蔽自己,使普通用户很难在中毒后发觉。

防治木马的危害,应该采取以下措施:第一,安装杀毒软件和个人防火墙,并及时升级。

第二,把个人防火墙设置好安全等级,防止未知程序向外传送数据。

第三,可以考虑使用安全性比较好的浏览器和电子邮件客户端工具。

木马的种类1、破坏型惟一的功能就是破坏并且删除文件,可以自动的删除电脑上的DLL、INI、EXE文件。

2、密码发送型可以找到隐藏密码并把它们发送到指定的信箱。

有人喜欢把自己的各种密码以文件的形式存放在计算机中,认为这样方便;还有人喜欢用WINDOWS提供的密码记忆功能,这样就可以不必每次都输入密码了。

许多黑客软件可以寻找到这些文件,把它们送到黑客手中。

也有些黑客软件长期潜伏,记录操作者的键盘操作,从中寻找有用的密码。

在这里提醒一下,不要认为自己在文档中加了密码而把重要的保密文件存在公用计算机中,那你就大错特错了。

别有用心的人完全可以用穷举法暴力破译你的密码。

利用WINDOWS API函数EnumWindows和EnumChildWindows对当前运行的所有程序的所有窗口(包括控件)进行遍历,通过窗口标题查找密码输入和出确认重新输入窗口,通过按钮标题查找我们应该单击的按钮,通过ES_PASSWORD 查找我们需要键入的密码窗口。

向密码输入窗口发送WM_SETTEXT消息模拟输入密码,向按钮窗口发送WM_COMMAND消息模拟单击。

UDP通信协议简介

UDP通信协议简介

UDP通信协议简介UDP(User Datagram Protocol,用户数据报协议)是一种简单的面向无连接的网络传输协议,它与TCP(Transmission Control Protocol,传输控制协议)一起构成了互联网传输层的两个基本协议。

本文将为您简要介绍UDP通信协议。

首先,我们来了解UDP的特点。

UDP是一种无连接的协议,这意味着在发送数据前不需要与对方建立连接,直接将数据包发送出去即可。

与TCP不同,UDP不提供可靠的数据传输,也就是说,它不关心数据是否能够完整地到达目的地。

此外,UDP也不提供流量控制和拥塞控制的机制,因此在网络传输过程中可能会丢失或乱序接收数据包。

UDP的通信过程相对简单。

发送方将数据封装成称为数据报的小包,包含源端口和目的端口信息,然后通过网络传输给接收方。

接收方通过端口号将数据包交给相应的应用程序进行处理。

由于UDP不需要连接的建立和维护,因此在短消息传递、媒体流传输等实时性要求较高的场景中广泛应用。

UDP的优势主要体现在以下几个方面。

首先,UDP的头部开销相对较小,仅占用8字节,相比之下,TCP的头部开销较大,占用20字节。

这使得UDP在网络传输效率方面更高一些。

其次,UDP适用于一对一、一对多和多对一的通信模式,可以满足不同场景下的需求。

最后,UDP支持广播和多播,可以将数据包同时发送给多个接收方,提高了数据传输的效率。

然而,UDP也存在一些不足之处。

由于UDP不提供可靠性保证,因此在重要性较高的数据传输中可能出现丢包的情况。

此外,UDP也不具备流量控制和拥塞控制的功能,无法有效地应对网络拥塞的情况。

因此,在对数据传输的可靠性和顺序性有较高要求的场景中,更适合选择TCP协议。

至于UDP的应用场景,主要包括以下几个方面。

首先,UDP适用于对实时性要求较高的应用,例如音视频传输、直播、在线游戏等。

这些应用对数据传输的实时性有较高要求,可以容忍一定的数据丢失。

有关TCPUDP的使用例子

有关TCPUDP的使用例子

有关TCPUDP的使用例子TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是网络通信中常用的两种传输协议。

它们在应用层之下的传输层提供了不同的传输方式和特性。

下面是关于TCP和UDP的使用例子。

1.聊天应用程序TCP协议适用于需要可靠传输的应用场景,比如聊天应用程序。

用户在手机或电脑上运行聊天应用程序,发送聊天信息给其他用户。

TCP协议确保信息按照发送的顺序接收,并且在传输过程中不会受到丢包或乱序的影响。

每个聊天消息的发送和接收都通过TCP连接完成,确保信息的可靠传输。

2.文件传输TCP协议也适用于大文件传输。

例如,用户需要通过互联网将大型文件发送给其他用户。

TCP协议保证了文件在传输过程中的完整性和准确性。

它会自动检测和纠正丢失或损坏的数据包,并确保接收方和发送方之间的数据一致性。

这种方式适用于需要确保每个数据包都到达的场景,尽管传输速度可能稍慢。

3.实时流媒体UDP协议适用于实时流媒体应用程序,如在线直播或在线游戏。

UDP提供了更低的延迟和更快的传输速率,但不提供像TCP那样的可靠性和顺序性。

在直播或游戏中,用户希望能快速看到视频或游戏画面,而不必要求每个数据包都到达和按顺序排列。

这样,UDP协议的特性更适合这类应用场景。

4.DNS(域名系统)DNS是将域名解析为IP地址的系统。

UDP协议通常用于DNS查询,因为它是一种简单的请求-响应协议。

当用户在浏览器中输入一个域名时,DNS解析请求将通过UDP协议发送到DNS服务器。

UDP快速地将请求传递给服务器,并且不需要进行复杂的连接设置,因为DNS查询通常是短暂而频繁的交互。

5.游戏中的多播UDP也可以用于多播(Multicast)应用,其中一台计算机可以将数据包发送给多个接收者。

在在线游戏中,UDP协议可用于将游戏状态信息快速广播给所有玩家。

多播可以减少网络流量,因为只有一次广播就可以到达多个接收者,而不是向每个接收者发送单独的数据包。

木马采用的伪装方法

木马采用的伪装方法

木马采用的伪装方法1. 修改图标木马服务端所用的图标也是有讲究的,木马经常故意伪装成了XT.HTML等你可能认为对系统没有多少危害的文件图标,这样很容易诱惑你把它打开。

看看,木马是不是很狡猾?2. 捆绑文件这种伪装手段是将木马捆绑到一个安装程序上,当安装程序运行时,木马在用户毫无察觉的情况下,偷偷地进入了系统。

被捆绑的文件一般是可执行文件(即EXE COM一类的文件)。

3. 出错显示有一定木马知识的人部知道,如果打开一个文件,没有任何反应,这很可能就是个木马程序。

木马的设计者也意识到了这个缺陷,所以已经有木马提供了一个叫做出错显示的功能。

当服务端用户打开木马程序时,会弹出一个错误提示框(这当然是假的),错误内容可自由定义,大多会定制成一些诸如" 文件已破坏,无法打开!" 之类的信息,当服务端用户信以为真时,木马却悄悄侵人了系统。

4. 自我销毁这项功能是为了弥补木马的一个缺陷。

我们知道,当服务端用户打开含有木马的文件后,木马会将自己拷贝到Windows的系统文件夹中(C;\wmdows或C:\windows'system 目录下),一般来说,源木马文件和系统文件夹中的木马文件的大小是一样的(捆绑文件的木马除外),那么,中了木马的朋友只要在近来收到的信件和下载的软件中找到源木马文件,然后根据源木马的大小去系统文件夹找相同大小的文件,判断一下哪个是木马就行了。

而木马的自我销毁功能是指安装完木马后,源木马文件自动销毁,这样服务端用户就很难找到木马的来源,在没有查杀木马的工具帮助下。

就很难删除木马了。

5. 木马更名木马服务端程序的命名也有很大的学问。

如果不做任何修改,就使用原来的名字,谁不知道这是个木马程序呢?所以木马的命名也是千奇百怪,不过大多是改为和系统文件名差不多的名字,如果你对系统文件不够了解,那可就危险了。

例如有的木马把名字改为window.exe ,如果不告诉你这是木马的话,你敢删除吗?还有的就是更改一些后缀名,比如把dll 改为dl 等,不仔细看的,你会发现吗?木马的种类1 、破坏型惟一的功能就是破坏并且删除文件,可以自动的删除电脑上的DLL INI、EXE文件。

Android上实现UDP客户端

Android上实现UDP客户端

Android上实现UDP客户端前言在之前的文章中我们已经讲过了TCP通讯的实现,大家如果有兴趣的话,可以参考以下文章:那么今天就让我们来了解下android上 UDP客户端的实现吧。

UDP服务端的实现,大家可以参看以下文章:这里我封装了一个udp客户端的封装类,UdpClient,下面对其使用进行讲解。

今天涉及以下内容:1.Tcp与Udp对比2.UdpClient主要方法介绍3.UdpClient在Activity中的使用4.效果图和项目结构图5.UdpClient源码先来波效果图客户端.gif服务端.png一. Tcp与 Udp 对比Tcp与Udp作为两种不同的通讯方式。

它们之间具备以下不同:1.Tcp通讯需要建立双向连接,而udp是不需要建立连接的2.Tcp传输数据以IO流的形式,udp是以数据报的模式。

Tcp的优势在于传输的数据有序且稳定,不会丢失数据。

udp传输的数据无序,并且不能保证数据的到达时间及完整性,可能出现丢包的情况。

3.在资源消耗上,tcp连接需要经过3次握手,断开也需要消耗资源,而udp则在资源消耗上相比较小二. UdpClient主要方法介绍上面讲过了tcp和udp的区别,那么下面就来讲讲udp客户端封装类UdpClient所具备的主要方法吧:三. UdpClient 在 Activity 中的使用下面贴出UdpClient在Activity中使用代码:四. 效果图和项目结构图由于篇幅原因,在下节我将讲述UDP服务端的封装使用实现,这里我贴出客户端及服务端运行效果图.客户端.gif服务端.png项目结构图.png五. UdpClient 源码下面贴出UdpClient源码:。

C语言实现UDP网络传输

C语言实现UDP网络传输

C语言实现UDP网络传输UDP(User Datagram Protocol,用户数据报协议)是一种面向无连接的传输协议,它在网络编程中具有重要的作用。

本文将介绍C语言如何实现UDP网络传输的基本原理和步骤。

一、UDP网络传输简介UDP是一种简单的传输层协议,相对于TCP(Transmission Control Protocol,传输控制协议)来说,UDP更加轻量级。

它不提供可靠性和流量控制,但是具有实时性较高的特点,适用于需要快速传输数据的场景,如音频、视频等实时应用。

UDP协议的数据包格式主要包括源端口号、目标端口号、长度、校验和以及数据。

由于UDP是无连接的,所以每个数据包都是独立发送的,不需要建立和维护连接,这使得UDP的实现相对简单。

二、C语言实现UDP网络传输步骤要使用C语言实现UDP网络传输,我们需要按照以下步骤进行操作:1. 创建套接字(Socket)在C语言中,使用socket()函数创建一个套接字,该套接字用于后续的数据传输。

在创建套接字时,需要指定协议簇(AF_INET代表IPv4)和套接字类型(SOCK_DGRAM代表使用UDP协议)。

2. 绑定本地地址和端口号使用bind()函数将套接字与本地地址和端口号绑定,以便接收数据和发送数据。

通常将本地地址设置为INADDR_ANY,端口号可以自定义。

3. 接收数据使用recvfrom()函数接收远程主机发送的数据,该函数会将接收到的数据存储到指定的缓冲区中,并返回接收到的字节数。

可以通过指定发送方的地址和端口号来实现数据的精确接收。

4. 发送数据使用sendto()函数将数据发送给目标主机,该函数需要指定目标主机的地址和端口号,并将待发送的数据和数据长度作为参数传入。

5. 关闭套接字使用close()函数关闭套接字,释放资源。

三、C语言实现UDP网络传输示例代码```c#include <stdio.h>#include <stdlib.h>#include <string.h>#include <arpa/inet.h>#define MAX_BUFFER_SIZE 1024#define SERVER_PORT 8888#define SERVER_IP "127.0.0.1"int main() {int sockfd;char buffer[MAX_BUFFER_SIZE];struct sockaddr_in server_addr, client_addr;socklen_t client_len = sizeof(client_addr);// 创建套接字sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd < 0) {perror("Error in creating socket");exit(1);}memset(&server_addr, 0, sizeof(server_addr));memset(&client_addr, 0, sizeof(client_addr));// 设置服务器地址和端口号server_addr.sin_family = AF_INET;server_addr.sin_port = htons(SERVER_PORT);server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);// 绑定本地地址和端口号if (bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {perror("Error in binding");exit(1);}printf("Server is listening for incoming connections...\n");while (1) {// 接收数据memset(buffer, 0, sizeof(buffer));ssize_t recv_len = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr*)&client_addr, &client_len);if (recv_len < 0) {perror("Error in receiving data");exit(1);}printf("Received data from client: %s\n", buffer);// 发送数据const char* msg = "Hello, client!";ssize_t send_len = sendto(sockfd, msg, strlen(msg), 0, (struct sockaddr*)&client_addr, client_len);if (send_len != strlen(msg)) {perror("Error in sending data");exit(1);}printf("Sent response to client: %s\n", msg);}// 关闭套接字close(sockfd);return 0;}```以上是一个简单的UDP服务器示例代码,它通过创建套接字、绑定地址和端口、接收数据并发送响应的方式来实现UDP网络传输。

UDP协议

UDP协议

(3) 如果目标端收到的UDP数据报中的目标端口号不能 与当前已使用的某端口号匹配,则将该数据报抛弃,并发 送目标端口不可达的ICMP差错报文。
标准UDP端口
(4) UDP协议在设计时的简单性,是为了保证UDP 在工作时的高效性和低延时性。因此,在服务质量较 高的网络中(如局域网),UDP可以高效地工作。 (5) UDP常用于传输延时小,对可靠性要求不高, 有少量数据要进行传输的情况,如DNS(域名服务)、 TFTP(简单文件传输)等。
最终目标的标识—UDP端口
UDP和TCP都使用了与应用层接口处的 端口(port)与上层的应用进程进行通信。
图8-7说明了端口在进程之间的通信
中所起的作用。
最终目标的标识—UDP端口
最终目标的标识— UDP端口
若没有端口,运输层就无法知道数据应 当交付给应用层的哪一个进程。端口是用来
标识应用层的进程。
图8-8举例说明了端口的作用。
最终目标的标识— UDP端口
最终目标的标识— UDP端口
端口分类:

一类是由因特网分配给一些常用的应用层程序固定使用的
熟知端口,其数值一般为0 ~ 1023。

另一类是临时端口,当写一种新的应用程序时,必须为它
指派一个临时端口,否则其他的应用进程就无法和它进行
交互。

还是为了可靠,可以不选。
标准UDP端口
UDP数据包中,源端口字段可选,目标端 口字段必须指定。接收主机发现IP协议字段为
17,就将数据交给UDP协议处理。
标准UDP端口
UDP 端口号 53 67 68 69 161 162 关键词 Domain BootPS BootPC TFTP SNMP SNMP-TRAP 描 域名服务器 引导协议服务器 引导协议客户机 简单文件传输协议 简单网络管理协议 简单网络管理协议陷阱 述

c语言udp通讯例程

c语言udp通讯例程

c语言udp通讯例程以下是一个简单的 C 语言 UDP 通讯例程,包括一个发送端和一个接收端:**发送端代码(sender.c):**```c#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/socket.h>#include <netinet/in.h>void sendMessage(int sock, const char *message) {size_t messageLength = strlen(message);// 发送数据send(sock, message, messageLength, 0);}int main() {int sock;struct sockaddr_in serverAddress;char message[1024];// 创建 UDP 套接字if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {perror("Failed to create socket");exit(EXIT_FAILURE);}// 设置服务器地址serverAddress.sin_family = AF_INET;serverAddress.sin_addr.s_addr = inet_addr("127.0.0.1"); // 请将这里的地址替换为接收端的实际 IP 地址serverAddress.sin_port = htons(54321); // 请将这里的端口替换为接收端的实际端口printf("Enter a message: ");scanf("%s", message);// 发送消息sendMessage(sock, message);// 关闭套接字close(sock);return 0;}```**接收端代码(receiver.c):**```c#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/socket.h>#include <netinet/in.h>void receiveMessage(int sock) {char message[1024];size_t messageLength;// 接收数据messageLength = recv(sock, message, sizeof(message) - 1, 0);message[messageLength] = '\0';printf("Received message: %s\n", message);}int main() {int sock;struct sockaddr_in serverAddress;socklen_t serverAddressLength = sizeof(serverAddress);// 创建 UDP 套接字if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {perror("Failed to create socket");exit(EXIT_FAILURE);}// 绑定套接字到本地地址serverAddress.sin_family = AF_INET;serverAddress.sin_addr.s_addr = INADDR_ANY;serverAddress.sin_port = htons(54321); // 请确保这里的端口与发送端使用的端口相同if (bind(sock, (struct sockaddr *)&serverAddress, sizeof(serverAddress)) == -1) {perror("Failed to bind socket");exit(EXIT_FAILURE);}// 接收消息receiveMessage(sock);// 关闭套接字close(sock);return 0;}```这个例子中,发送端发送一个 UDP 数据包到接收端,接收端接收到数据包并打印出消息内容。

udp select例子

udp select例子

udp select例子UDP是一种无连接的传输协议,通过网络传输数据时不需要建立连接,因此具有较低的延迟和较高的传输速率。

在使用UDP进行网络编程时,可以使用select函数来实现多路复用的功能,即同时监听多个网络事件。

下面是关于UDP和select函数的一些例子:1. UDP服务器端程序:通过UDP协议接收客户端发送的数据,并给客户端发送响应数据。

使用select函数监听多个文件描述符,包括标准输入和UDP套接字。

2. UDP客户端程序:通过UDP协议向服务器端发送数据,并接收服务器端的响应数据。

同样使用select函数监听标准输入和UDP套接字。

3. 多线程UDP服务器:使用多线程技术实现UDP服务器,每个线程负责处理一个客户端的请求。

通过select函数监听多个UDP套接字,每个套接字对应一个线程。

4. UDP广播:通过UDP协议实现广播功能,将一条消息发送给局域网内的所有主机。

使用select函数监听UDP套接字,接收其他主机的广播消息。

5. UDP组播:通过UDP协议实现组播功能,将一条消息发送给组播组内的所有成员。

使用select函数监听UDP套接字,接收组播组内的消息。

6. UDP文件传输:通过UDP协议实现文件传输功能,将一个文件分成多个数据包进行传输。

使用select函数监听UDP套接字,接收和发送数据包。

7. UDP视频流传输:通过UDP协议实现实时视频流传输,将视频数据分成多个数据包进行传输。

使用select函数监听UDP套接字,接收和发送视频数据包。

8. UDP语音通话:通过UDP协议实现实时语音通话,将语音数据分成多个数据包进行传输。

使用select函数监听UDP套接字,接收和发送语音数据包。

9. UDP游戏服务器:通过UDP协议实现多人在线游戏服务器,接收和发送玩家的游戏数据。

使用select函数监听UDP套接字,处理玩家的游戏请求。

10. UDP心跳包:通过UDP协议实现心跳包功能,定时向服务器发送心跳包以保持连接。

有关TCPUDP的使用例子

有关TCPUDP的使用例子

有关TCPUDP的使用例子TCP (Transmission Control Protocol) 和 UDP (User Datagram Protocol) 是互联网通信协议的两种常见形式。

它们在计算机网络中扮演着重要的角色,可以用于不同的应用场景。

1.TCP使用例子:a) 网页浏览:TCP 在 Web 浏览中发挥了重要作用。

当用户在浏览器中输入 URL 或点击链接时,浏览器会向服务器发出 TCP 请求。

服务器接收到请求后,通过建立 TCP 连接,将网页内容返回给浏览器。

浏览器在接收到响应后,使用 TCP 协议将网页渲染并显示给用户。

c) 电子邮件传输:TCP 也被用于传输电子邮件。

当用户通过客户端(如 Outlook、Gmail等)发送电子邮件时,客户端会使用 TCP 发送邮件消息到邮件服务器。

服务器使用 TCP 将邮件消息传输到目标邮件服务器,确保邮件的完整性和可靠性。

2.UDP使用例子:a)流媒体传输:UDP在流媒体传输中被广泛使用。

流媒体是指实时传输音频和视频的应用,如在线直播和视频通话。

UDP提供了快速的传输速度和较低的延迟,使得流媒体应用程序可以实时地发送和接收数据。

尽管UDP存在丢包问题,但在流媒体应用中,偶尔丢失一些数据也不会对用户体验产生太大影响。

b)DNS解析:UDP用于域名系统(DNS)解析,将域名转换为IP地址。

当用户在浏览器中输入URL时,浏览器会通过UDP向DNS服务器发送请求,以获取与该URL对应的IP地址。

DNS服务器使用UDP将IP地址回传给浏览器,然后浏览器使用该IP地址发送TCP请求以获取网页内容。

c)游戏数据传输:UDP在在线游戏中被广泛使用。

在线游戏通常需要快速的实时通信,UDP提供了低延迟和快速的传输速度。

游戏中的动作和信息需要快速传输,而不需要等待数据的可靠性,因此使用UDP更加合适。

总结:TCP适用于需要可靠数据传输和顺序传输的应用场景,例如网页浏览、文件传输和电子邮件传输。

发送端与接收端

发送端与接收端

文件传输之发送端1.编程要点本程序是基于UDP来实现文件传输的,主要用到Udpclient类以及XmlSerializer类来传输文件和序列化对象。

其中XmlSerializer类位于System.Xml.Serialization命名空间中,一下简单介绍该命名空间。

System.Xml.Serialization命名空间包含了用于将对象序列化为XML格式文档或流的类,它的中心类是XmlSerializer类,它的功能是将对象序列化到XML 文档中和从XML文档中反序列化对象。

下面简要介绍序列化对象以及反序列化对象的步骤。

(1)序列化对象的步骤:①用XmlSerializer的构造函数创建类的实例(使用要序列化的对象的类型)。

②创建要序列化的对象的实例以及创建对象(例如Stream,TextWriter或XmlWriter),以将文件写入文档或流中。

③调用Serialize方法将对象转换为XML文档。

(2)反序列化对象的步骤:①用要被反序列化的对象的类型构造一个XmlSerializer。

②创建读取文档或流的合适的对象(仍然为Stream,TextWriter或XmlWriter)。

③调用Deserialize方法反序列化对象。

④将结果为对象转换为原始对象类型。

以下介绍XmlSerializer类的构造函数和方法。

public XmlSerializer(Type type):将指定类型的对象序列化为XML文档或反之。

其中参数type表示此XmlSerializer可序列化的对象的类型。

public void Serializer(Stream stream,object o):将指定的Stream序列化指定的Object并将XML文党写入文件。

其中参数stream表示用于编写XML文档的Stream;参数o表示将要序列化的Object。

注意:Serialize方法将对象的公共字段和读/写属性转换为XML,它不转换方法、索引器、私有字段或只读属性。

java实现udp发送端和接收端

java实现udp发送端和接收端

java实现udp发送端和接收端发送端:package demo02;import java.io.IOException;import .DatagramPacket;import .DatagramSocket;import .InetAddress;import .UnknownHostException;/** 实现UDP协议的发送端:* 实现封装数据的类 .DatagramPacket 将你的数据包装* 实现数据传输类 .DatagramSocket 将数据包发出去** 实现步骤:* 1.创建DatagramPacket对象,封装数据,接收的地址和端⼝* 2.创建DatagramSocket对象,* 3.调⽤DatagramSocket类的⽅法send,发送数据包* 4.关闭资源** DatagramPacket构造⽅法:* DatagramPacket(byte[] buf,int length,InetAddress address,int port)** DatagramSocket构造⽅法:* DatagramSocket()空参数* ⽅法:send(DatagramPacket d)***/public class UDPSend {public static void main(String[] args) throws IOException {//创建数据包对象,封装要发送的数据,接受端IP,端⼝byte[] data="你好UDP".getBytes();//创建InetAddress对象,封装⾃⼰的IP地址InetAddress inet=InetAddress.getByName("127.0.0.1");DatagramPacket dp=new DatagramPacket(data,data.length,inet,6000);//创建DatagramSocket对象,数据包的发送和接受对象DatagramSocket ds=new DatagramSocket();//调⽤ds对象的⽅法send,发送数据包ds.send(dp);ds.close();}}接收端package demo01;import java.io.IOException;import .DatagramPacket;import .DatagramSocket;/** 实现UDP接收端* 实现封装数据包.DatagramPacket 将数据接收* 实现输出传输 .DatagramSocket 接受数据包** 实现步骤:* 1.创建DatagramSocket对象,绑定端⼝号* 要和发送数据端⼝号⼀致* 2.创建字节数组,接受发来的数组* 3.创建数据包对象DatagramPacket* 4.调⽤DatagramSocket对象⽅法 receive(DatagramPacket dp)* 接受数据,数据放在数据包中* 5.拆包* 发送的IP地址* 数据包对象DatagramPacket()⽅法getAddress()获取的是发送端的IP地址对象* 接受到的字节个数* 数据包对象DatagramPacket()⽅法getLength()* 发送⽅的端⼝号* 数据包对象DatagramPacket()⽅法getPort()* 6.关闭资源*/public class UDPReceive {public static void main(String[] args) throws IOException {//创建数据包传输对象DatagramSocket 绑定端⼝号DatagramSocket ds=new DatagramSocket(6000);//创建字节数组byte[] data=new byte[1024];//创建数据包对象,传递字节数组DatagramPacket dp=new DatagramPacket(data, data.length);//调⽤ds对象的⽅法receive传递数据包ds.receive(dp);//获取发送端的IP地址对象String ip=dp.getAddress().getHostAddress();//获取发送的端⼝号int port=dp.getPort();//获取接收到的字节数int length=dp.getLength();System.out.println(new String(data,0,length)+"...."+ip+":"+port); ds.close();}}。

基于C#的UDP通信(使用UdpClient实现,包含发送端和接收端)

基于C#的UDP通信(使用UdpClient实现,包含发送端和接收端)

基于C#的UDP通信(使⽤UdpClient实现,包含发送端和接收端)UDP不属于⾯向连接的通信,在选择使⽤协议的时候,选择UDP必须要谨慎。

在⽹络质量令⼈⼗分不满意的环境下,UDP协议数据包丢失会⽐较严重。

但是由于UDP的特性:它不属于连接型协议,因⽽具有资源消耗⼩,处理速度快的优点,所以通常⾳频、视频和普通数据在传送时使⽤UDP较多,因为它们即使偶尔丢失⼀两个数据包,也不会对接收结果产⽣太⼤影响。

⽐如我们聊天⽤的ICQ和QQ就是使⽤的UDP协议。

我们通过UDP进⾏信息收发的时候,没有严格客户端和服务端的区别,它不同于UDP,UDP 必须建⽴可靠连接之后才可以通信,⽽UDP随时都可以给指定的ip和端⼝所对应进程发送消息。

UDP发送消息时需要绑定⾃⼰IP 和端⼝号,接收消息的时候没有特殊限制,只要有⼈给⾃⼰发送,⾃⼰在线,就可以接收。

(⽹上例⼦很多,但是总有⼀点地⽅看不懂。

下⾯附上我的⼩例⼦,仅供参考。

)发送端:1using System;2using System.Text;3using System.Windows.Forms;4using .Sockets;5using ;67namespace client8 {9public partial class Form1 : Form10 {11public Form1()12 {13 InitializeComponent();14 }1516//初始化⼀个UdpClient的新实例17 UdpClient sendUdpClient = new UdpClient();1819//单击事件20private void btn_send_Click(object sender, EventArgs e)21 {22string message = txt_sendmsg.Text;2324if(string.IsNullOrEmpty(message))25 {26 MessageBox.Show("发送内容不能为空!");27 txt_sendmsg.Focus();28return;29 }3031//⽤指定IP地址和端⼝号初始化IPEndPoint类的新实例32 IPEndPoint local = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8888);3334//将数据报发送⾄指定主机35 sendUdpClient.Send(Encoding.UTF8.GetBytes(message), message.Length, local);3637 }38 }39 }View Code接收端:1using System;2using System.Text;3using System.Windows.Forms;4using ;5using .Sockets;6using System.Threading;78namespace server9 {10public partial class Form1 : Form11 {12public Form1()13 {14 InitializeComponent();15 }1617private void Form1_Load(object sender, EventArgs e)18 {19//初始化新线程⽤来接收消息20 Thread myThread = new Thread(ReceiveMsg);2122//设为后台线程23 myThread.IsBackground = true;2425//开启线程26 myThread.Start();27 }2829private UdpClient receiveUdpClient;3031private const int port = 8888;3233 IPAddress ip = IPAddress.Parse("127.0.0.1");3435//接收消息36private void ReceiveMsg()37 {38//⽤指定IP地址和端⼝号初始化IPEndPoint类的新实例39 IPEndPoint local = new IPEndPoint(ip, port);4041//初始化⼀个UdpClient的新实例并绑定到本地42 receiveUdpClient = new UdpClient(local);4344while(true)45 {46try47 {48//返回由主机发来的数据报49byte[] receiveBytes = receiveUdpClient.Receive(ref local);5051string receivemsg = Encoding.UTF8.GetString(receiveBytes, 0, receiveBytes.Length);52 ShowMessage(lst_receivemsg, receivemsg);53 }54catch55 {56break;57 }58 }59 }6061// 通过委托回调机制显⽰消息内容62delegate void ShowMessageDelegate(ListBox listbox, string text);6364private void ShowMessage(ListBox listbox, string text)65 {66//如果控件的 Handle 是在与调⽤线程不同的线程上创建的(此时,您必须通过 Invoke ⽅法对控件进⾏调⽤),则为 true;否则为 false。

UDP协议为什么分客户端和服务器端

UDP协议为什么分客户端和服务器端

UDP协议为什么分客户端和服务器端UDP协议使⽤sendto/recvfrom函数发收数据,sendto函数要使⽤⽬的地址作为参数,⽽recvfrom函数则返回发送端的地址.
服务器端和客户端都可以收发数据,那么客户端和服务器的区别在哪了?.区别在于服务器端要将地址和端⼝号绑定. 如果不绑定就⽆法使⽤recvfrom接受数据,与其说它是服务器端不如说是后发端.
客户端不需要绑定地址,只需要知道服务器端的地址就⾏.因为客户端必须先向服务器端发送数据. 这时候系统就⾃动为它绑定了⼀个IP地址和端⼝号. 让后就可以使⽤recvfrom接收数据了.
所以服务器端和客户端的区别在于⼀个先发数据,⼀个后接收数据.
那么, 如果两端都先使⽤sendto发送数据会怎么样了? 那么两端都不需要绑定地址了,但是这样⼀来两端就都得知道对⽅的地址了. 这显然⽐⼀⽅绑定⿇烦.。

单向udp传输原理

单向udp传输原理

单向udp传输原理标题:单向UDP传输原理:实现高效的数据传输引言:在计算机网络通信中,数据传输是至关重要的一环。

传统的协议如TCP(传输控制协议)以及UDP(用户数据报协议)被广泛使用。

本文将重点探讨UDP协议的单向传输原理,以及它如何实现高效的数据传输。

第一部分:UDP协议简介UDP是一种面向无连接的协议,通过用户数据报实现数据的传输。

相比于TCP,UDP更加灵活,并且没有建立连接和确认机制。

它的单向传输机制使得它在特定场景下更具优势,比如实时音视频传输和游戏开发等。

第二部分:单向UDP传输的基本原理单向UDP传输主要涉及两个主要组件:发送方和接收方。

发送方将数据打包成用户数据报并发送给接收方。

接收方则通过监听指定的端口来接收数据报。

在单向UDP传输中,发送方将数据分割为较小的数据包,称为数据报。

每个数据报都包含有关数据的信息,如数据大小、发送时间戳以及源目标区域信息等。

数据报独立地传输,没有确认机制,可能会丢失或乱序。

因此,在实现单向UDP传输时应考虑这些因素,并使用适当的算法来处理数据丢失或乱序的情况。

第三部分:实现高效的单向UDP传输要实现高效的单向UDP传输,以下几个因素需要考虑:1. 丢包处理机制:由于UDP没有确认机制,数据包可能会在传输过程中丢失。

为了实现高效的传输,可以使用一些丢包处理机制,如重传机制、冗余校验和FEC(前向纠错)等。

2. 流量控制:在高负载情况下,网络可能出现拥塞,导致数据包丢失。

为了避免这种情况,可以采用流量控制算法,如拥塞控制、滑动窗口等,来调整发送方的数据传输速率。

3. 数据包大小优化:在单向UDP传输中,数据包的大小对传输效率有影响。

较小的包可以提高数据传输速度,但会增加网络开销。

通过适当地调整数据包大小,可以在传输速度和网络开销之间找到一个平衡点。

第四部分:总结和回顾通过本文的讨论,我们深入了解了单向UDP传输的原理和实现方法。

单向UDP传输在实时通信和游戏开发等领域具有重要意义。

单向udp传输原理

单向udp传输原理

单向udp传输原理单向UDP传输原理UDP(User Datagram Protocol)是一种无连接的传输协议,它不保证数据包的可靠性和顺序性,但具有高效性和实时性。

单向UDP传输是指数据只从发送端传输到接收端,不允许接收端向发送端发送数据。

一、UDP协议简介1. UDP协议概述UDP是一种无连接的传输协议,它不同于TCP(Transmission Control Protocol)协议需要建立连接后再进行数据传输。

在UDP中,每个数据包都是独立的、完整的信息单位,没有任何先后顺序和关联关系。

因此,UDP具有高效性和实时性。

2. UDP协议特点(1)无连接:每个数据包都是独立的、完整的信息单位,没有任何先后顺序和关联关系。

(2)不可靠:由于没有确认机制和重传机制,所以无法保证数据包的可靠性。

(3)速度快:由于没有建立连接等操作,所以UDP具有高效性和实时性。

二、单向UDP传输原理1. 单向UDP传输概述单向UDP传输是指数据只从发送端传输到接收端,不允许接收端向发送端发送数据。

在单向UDP传输中,发送端将数据打成一个个独立的数据包,通过UDP协议传输到接收端。

接收端接收到数据包后,将其按照特定的顺序组装成完整的数据。

2. 单向UDP传输流程(1)发送端将数据打成一个个独立的数据包,每个数据包都有自己的编号和长度信息。

(2)发送端将数据包通过UDP协议传输到接收端。

(3)接收端接收到数据包后,将其按照特定的顺序组装成完整的数据。

3. 单向UDP传输优缺点(1)优点:① 速度快:由于没有建立连接等操作,所以单向UDP传输具有高效性和实时性。

② 数据量小:由于每个数据包都是独立的、完整的信息单位,所以单向UDP传输适合传输小量数据。

(2)缺点:① 不可靠:由于没有确认机制和重传机制,所以无法保证数据包的可靠性。

② 无法保证顺序性:由于每个数据包都是独立的、没有任何先后顺序和关联关系,所以无法保证数据包按照特定顺序组装成完整的数据。

udp名词解释

udp名词解释

udp名词解释UDP (User Datagram Protocol) 是一种无连接的传输层协议,它主要用于互联网上的数据传输。

与TCP (Transmission Control Protocol) 相比,UDP不提供可靠的数据传输和错误检测机制,因此传输效率较高,但也更容易丢失数据。

UDP协议的特点包括:1. 无连接:UDP不需要在通信前进行握手,通信双方不需要在发送或接收数据前建立连接。

这使得UDP成为一种适用于实时应用的协议,如音频和视频传输,因为它可以快速地发送数据包。

2. 高效:UDP不会对数据进行分割和重新组装,也不会对数据进行确认和重传,因此传输效率较高。

这使得UDP广泛应用于需要快速传输数据的场景,如在线游戏。

3. 简单:UDP的头部信息较少,只包括源端口、目的端口、长度和校验和等基本的字段,因此它的实现和处理相对简单。

4. 无拥塞控制:UDP对网络拥塞没有感知,当网络拥塞时,UDP会继续发送出去,导致数据丢失风险增加。

因此,UDP适用于低延迟和带宽较大的应用。

UDP主要用于以下方面:1. 实时应用:UDP适用于需要实时传输数据的应用,如实时音视频通话、直播等。

由于UDP无连接的特点,可以更快地传输数据,但也容易出现数据丢失的情况。

2. 域名解析:UDP用于域名解析过程中,客户端向DNS服务器发送查询请求,以获取与域名相关的IP地址等信息。

3. 广播和多播:UDP支持广播和多播功能,可以将数据同时发送给多个接收端。

这在一些需要向多个设备发送相同数据的应用中非常有用,如视频会议。

尽管UDP是一种无连接的协议,但它在某些场景下依然是非常重要的。

与TCP相比,UDP更快、更灵活,而且在一些对实时性要求较高的应用中具有更好的表现。

然而,由于它不提供可靠性和错误检测机制,使用UDP时需要注意确保数据的完整性和可靠性。

TDP协议——精选推荐

TDP协议——精选推荐

TDP协议UDP/TCP区别区别在于,UDP中只有发送端和接收端,不区分客户端与服务器端,计算机之间可以任意地发送数据。

⽽TCP通信是严格区分客户端与服务器端的,在通信时,必须先由客户端去连接服务器端才能实现通信,服务器端不可以主动连接客户端,并且服务器端程序需要事先启动,等待客户端的连接。

TCP相关类⼀个是ServerSocket类,⽤于表⽰服务器端,⼀个是Socket类,⽤于表⽰客户端。

相关⽅法ServerSocket类服务器得到客户端ServerSocket ServerSocket();获取客户端Socket对象Socket accept()获取本机地址InetAddress getInetAddress();Socket类地址:端⼝号Socket(String host,int port)获取端⼝号int getPort()结束标志void sutdownIntPut();相关实例* 实现TCP 服务器程序* 表⽰服务器程序的类 .ServerSocket* 构造⽅法:* ServerSocket(int port)传递端⼝号* 很重要的事情:必须要获得客户端的套接字对象Socket* Socket accept()** 1,创建服务器ServerSocket对象(指定服务器端⼝号)* 2,开启服务器了,等待客户端的连接,当客户端连接后,可以获取到连接服务器的客户端Socket对象* 3,给客户端反馈信息* 4,关闭流资源*/publicclass TCPServer {publicstaticvoid main(String[] args) throws IOException {//1,创建服务器ServerSocket对象(指定服务器端⼝号)ServerSocket ss = new ServerSocket(8888);//2,开启服务器了,等待客户端的连接,当客户端连接后,可以获取到连接服务器的客户端Socket对象Socket s = ss.accept();//3,给客户端反馈信息/** a,获取客户端的输出流* b,在服务端端,通过客户端的输出流写数据给客户端*///a,获取客户端的输出流OutputStream out = s.getOutputStream();//b,在服务端端,通过客户端的输出流写数据给客户端out.write("你已经连接上了服务器".getBytes());//4,关闭流资源out.close();s.close();//ss.close(); 服务器流通常都是不关闭的}}完成了服务器端程序的编写,接下来编写客户端程序。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

*/ class su { public static void main(String[] args) { // 1.建立udp socket服务,使用DatagramSocket对象,通常会监听一个接口,就是给这个数据接收端定义一个数字标识 DatagramSocket ds = new DatagramSocket(10000);//这时候是有数字标识的,此时要和发送端的端口一样,否则接收不到数
public static void main(String[] args) {
try { // 1.建立udp socket服务,使用DatagramSocket对象 DatagramSocket ds = new DatagramSocket(); // 2.确定数据,并封装数据包 byte[] buf = "udp ceshi".getBytes(); DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("10.107.10.138"), 10000); // 3.通过socket服务,使用send方法,将数据包发送出去 ds.send(dp); // 4.关闭资源 ds.close();
public static void main(String[] args) {
try { // 1.建立udp socket服务,使用DatagramSocket对象 DatagramSocket ds据包 byte[] buf = "udp ceshi".getBytes(); DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("10.107.10.138"), 10000); // 3.通过socket服务,使用send方法,将数据包发送出去 ds.send(dp); // 4.关闭资源 ds.close();
/** * 需求: 使用UDP协议,传送一段数据 步骤 1.建立udp socket服务,建立端点 2.确定数据,并使用DatagramPacket封装数据 * 3.使用socket服务,使用send方法,将数据包发送出去 4.关闭资源 * * @author xiaoxiongdeliwu * */ public class UPDDemo {
} catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace();
}
}
class su { public static void main(String[] args) { // 1.建立udp socket服务,使用DatagramSocket对象 DatagramSocket ds = new DatagramSocket();//这时候是有数字标识的,

//这句不能往while里面放,循环回来的时候,就变成两个服务用一个端口,就会出现绑定异常
// 2.定义数据包,存储数据 byte[] buf = new byte[1024]; DatagramPacket dt = new DatagramPacket(buf, buf.length);// 这个是用于接受的函数 // 3.通过服务的receive方法将受到的数据存入数据包中,存在dt中了,不是ds中 ds.receive(dt); // 4.通过数据包的方法获取其中的数据,包含地址,端口,数据 String ip = dt.getAddress().getHostAddress(); int port = dt.getPort(); String data = new String(dt.getData(), 0, dt.getLength());// 由于获取的是字节数组, // 所以要将字节数组变为字符串输出,但是不能将1024 都输出,所以就从0开始,到dt.length()结束 System.out.println(ip + "....." + port + "....." + data); //5.关闭资源 ds.close(); } } } 打开的时候,会遇到Windows防火墙 receive() 方法是阻塞式方法。没有数据的时候,就会等待,当有数据发过来的时候,才会notify 要注意系统会给发送端也随机定义一个数字标识,然后输出
UDP实例(只区分发送端和接受端,不分客户端和服务器端)
package sr;
import .DatagramPacket; import .DatagramSocket; import .InetAddress;
/** * 需求: 使用UDP协议,传送一段数据 步骤 1.建立udp socket服务,建立端点 2.确定数据,并使用DatagramPacket封装数据 * 3.使用socket服务,使用send方法,将数据包发送出去 4.关闭资源 * * @author xiaoxiongdeliwu * */ public class UPDDemo {
//这句不能往while里面放,循环回来的时候,就变成两个服务用一个端口,就会出现绑定异常
// 2.定义数据包,存储数据 byte[] buf = new byte[1024]; DatagramPacket dt = new DatagramPacket(buf, buf.length);// 这个是用于接受的函数 // 3.通过服务的receive方法将受到的数据存入数据包中,存在dt中了,不是ds中 ds.receive(dt); // 4.通过数据包的方法获取其中的数据,包含地址,端口,数据 String ip = dt.getAddress().getHostAddress(); int port = dt.getPort(); String data = new String(dt.getData(), 0, dt.getLength());// 由于获取的是字节数组, // 所以要将字节数组变为字符串输出,但是不能将1024 都输出,所以就从0开始,到dt.length()结束 System.out.println(ip + "....." + port + "....." + data); //5.关闭资源
但其实这个时候是不能进行通讯的,虽然这个时候DatagramSocket ds = new DatagramSocket();//这时候是有数字标识的,是系统给 分配的,但是具体的标识是多少是不确定的,所以就没有办法通信 所以改成 package sr;
import .DatagramPacket; import .DatagramSocket; import .InetAddress;
} catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace();
}
} /** * 定义一个UDP的接收端 *1.建立udp socket服务,使用DatagramSocket对象,通常会监听一个接口,就是给这个数据接收端定义一个数字标识 * 方便于明确哪些数据过来可以被该应用程序接受并处理 2.定义数据包,存储数据 3.通过服务的receive方法将受到的数据存入数据包中,存在dt中了,不是ds中 4.通过数据包的方法获取其中的数据,包含地址,端口,数据 5.关闭资源
相关文档
最新文档