基于UDP的数据传输方法、装置及设备与流程

文档序号:27679835发布日期:2021-11-30 23:10阅读:217来源:国知局
基于UDP的数据传输方法、装置及设备与流程
基于udp的数据传输方法、装置及设备
技术领域
1.本技术涉及计算机网络技术领域,尤其涉及一种基于udp的数据传输方法、装置及设备。


背景技术:

2.在媒体数据传输场景中,可能存在多个客户端同时与服务器进行数据传输,因此,具有高并发的数据传输需求。
3.现有技术中,为了保证媒体数据传输的实时性,通常采用用户数据报协议(user datagram protocol,udp)进行数据传输。但是,采用udp协议时,服务端只能通过同一个套接字与所有的客户端进行通信,无法满足高并发的数据传输需求。


技术实现要素:

4.本技术实施例提供一种基于udp的数据传输方法、装置及设备,以实现高并发场景的数据传输。
5.第一方面,本技术实施例提供一种基于udp的数据传输方法,包括:
6.通过第一线程对第一套接字socket进行监听,获取通过所述第一socket接收到的第一数据包;
7.从所述第一数据包中获取第一客户端的地址信息,所述第一客户端为发送所述第一数据包的客户端;
8.创建第二socket,根据所述地址信息将所述第二socket连接至所述第一客户端,并通过第二线程对所述第二socket进行监听,所述第二socket用于与所述第一客户端进行第二数据包的传输。
9.一种可能的实现方式中,所述第二线程采用epoll事件监听机制;所述通过第二线程对所述第二socket进行监听,包括:
10.将所述第二socket加入与所述第二线程对应的epoll的监听队列。
11.一种可能的实现方式中,所述将所述第二socket加入与所述第二线程对应的epoll的监听队列,包括:
12.根据预设的哈希规则,从线程池包括的多个第二线程中,确定用于监听所述第二socket的目标第二线程;
13.将所述第二socket加入与所述目标第二线程对应的epoll的监听队列。
14.一种可能的实现方式中,所述获取通过所述第一socket接收到的第一数据包之后,还包括:
15.从所述第一数据包中获取第二客户端的地址信息,所述第二客户端为需要接收所述第一数据包的客户端;
16.所述将所述第二socket加入与所述目标第二线程对应的epoll的监听队列,包括:
17.生成与所述第二socket对应的事件监听信息,所述事件监听信息用于指示对所述
第二socket的预设事件进行监听,所述预设事件的参数包括所述第二客户端的地址信息;
18.将所述第二socket以及所述事件监听信息加入与所述目标第二线程对应的epoll的监听队列。
19.一种可能的实现方式中,所述方法还包括:
20.通过所述目标第二线程,获取由所述第二socket接收到的所述第二数据包;
21.根据与所述第二socket对应的事件监听信息,确定所述第二数据包对应的第二客户端的地址信息,并将所述第二数据包发送至所述第二客户端。
22.一种可能的实现方式中,所述通过第一线程对第一socket进行监听之前,还包括:
23.创建所述第一socket;
24.创建所述第一线程,以及与所述第一线程对应的epoll,将所述第一socket加入与所述第一线程对应的epoll的监听队列。
25.一种可能的实现方式中,所述通过第一线程对第一socket进行监听之前,还包括:
26.创建所述线程池,所述线程池中包括多个第二线程;
27.分别创建与每个所述第二线程对应的epoll。
28.第二方面,本技术实施例提供一种基于udp的数据传输装置,包括:
29.获取模块,用于通过第一线程对第一套接字socket进行监听,获取通过所述第一socket接收到的第一数据包;
30.处理模块,用于从所述第一数据包中获取第一客户端的地址信息,所述第一客户端为发送所述第一数据包的客户端;
31.所述处理模块,还用于创建第二socket,根据所述地址信息将所述第二socket连接至所述第一客户端,并通过第二线程对所述第二socket进行监听,所述第二socket用于与所述第一客户端进行第二数据包的传输。
32.一种可能的实现方式中,所述第二线程采用epoll事件监听机制;所述处理模块具体用于:
33.将所述第二socket加入与所述第二线程对应的epoll的监听队列。
34.一种可能的实现方式中,所述处理模块具体用于:
35.根据预设的哈希规则,从线程池包括的多个第二线程中,确定用于监听所述第二socket的目标第二线程;
36.将所述第二socket加入与所述目标第二线程对应的epoll的监听队列。
37.一种可能的实现方式中,所述处理模块还用于:
38.从所述第一数据包中获取第二客户端的地址信息,所述第二客户端为需要接收所述第一数据包的客户端;
39.生成与所述第二socket对应的事件监听信息,所述事件监听信息用于指示对所述第二socket的预设事件进行监听,所述预设事件的参数包括所述第二客户端的地址信息;
40.将所述第二socket以及所述事件监听信息加入与所述目标第二线程对应的epoll的监听队列。
41.一种可能的实现方式中,所述获取模块还用于:通过所述目标第二线程,获取由所述第二socket接收到的所述第二数据包;
42.所述处理模块还用于:根据与所述第二socket对应的事件监听信息,确定所述第
二数据包对应的第二客户端的地址信息,并将所述第二数据包发送至所述第二客户端。
43.一种可能的实现方式中,所述装置还包括:创建模块,所述创建模块用于:
44.创建所述第一socket;
45.创建所述第一线程,以及与所述第一线程对应的epoll,将所述第一socket加入与所述第一线程对应的epoll的监听队列。
46.一种可能的实现方式中,所述创建模块还用于:
47.创建所述线程池,所述线程池中包括多个第二线程;
48.分别创建与每个所述第二线程对应的epoll。
49.第三方面,本技术实施例提供一种服务器,包括:存储器和处理器,所述存储器用于存储计算机程序,所述处理器运行所述计算机程序执行如第一方面任一项所述的方法。
50.第四方面,本技术实施例提供一种计算机可读存储介质,所述计算机可读存储介质包括计算机程序,所述计算机程序被处理器执行时实现如第一方面任一项所述的方法。
51.本技术实施例提供的基于udp的数据传输方法、装置及设备,通过第一线程对第一socket进行监听,获取通过第一socket接收到的第一数据包,从第一数据包中获取发送该第一数据包的第一客户端的地址信息,创建第二socket,根据所述地址信息将第二socket连接至第一客户端,并通过第二线程对第二socket进行监听,以通过第二socket与第一客户端进行第二数据包的传输。通过上述过程,实现了每个客户端均对应一个第二socket。当多个客户端并发式地与服务器进行数据传输时,服务器通过与每个客户端各自对应的第二socket来传输数据,实现了多个客户端之间的并行处理,因此,可以满足高并发的数据传输需求。另外,本实施例通过第一线程对第一socket进行监听,通过第二线程对第二socket进行监听,使得根据监听到数据包的线程即可自然区分出接收到的数据包为第一数据包或第二数据包,无需再针对接收到数据包的socket进行额外判断,能够提高数据传输效率,保证数据传输的实时性。
附图说明
52.为了更清楚地说明本技术实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本技术的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
53.图1为本技术实施例适用的一种系统架构的示意图;
54.图2为本技术一个实施例提供的基于udp的数据传输方法的流程示意图;
55.图3为本技术另一个实施例提供的基于udp的数据传输方法的流程示意图;
56.图4a至图4g为本技术实施例提供的数据传输过程的示意图;
57.图5为本技术一个实施例提供的基于udp的数据传输装置的结构示意图;
58.图6为本技术另一个实施例提供的基于udp的数据传输装置的结构示意图;
59.图7为本技术实施例提供的电子设备的结构示意图。
具体实施方式
60.下面将结合本技术实施例中的附图,对本技术实施例中的技术方案进行清楚、完
整地描述,显然,所描述的实施例仅仅是本技术一部分实施例,而不是全部的实施例。基于本技术中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本技术保护的范围。
61.本技术的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本技术的实施例例如能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
62.本技术实施例提供的数据传输方法,可应用于媒体数据的传输场景。其中,媒体数据包括但不限于:视频数据、音频数据、图像数据等。以视频数据为例,本实施例的应用场景包括但不限于:视频通话场景、视频会议场景、视频监控场景等。下面结合图1对本技术涉及的系统架构进行介绍。
63.图1为本技术实施例适用的一种系统架构的示意图。如图1所示,该系统架构包括多个终端设备102和服务器101。终端设备102和服务器101之间通过网络连接。
64.一些示例中,每个终端设备102可以与服务器101进行数据传输。例如,终端设备将数据发送给服务器,或者,终端设备从服务器接收数据。
65.另一些示例中,任意两个或者多个终端设备102之间可以进行数据传输,不同终端设备102之间传输的数据需要通过服务器的转发。例如,终端设备a将数据发送给服务器,并指示服务器转发给终端设备b,服务器接收到该数据后,根据指示将该数据转发给终端设备b。
66.本技术实施例中,终端设备可以称为客户端。终端设备为具有收发功能的电子设备,包括但不限于:智能手机、笔记本电脑、平板电脑、车载终端、智能穿戴设备、会议终端、摄像终端等。服务器可以称为服务端。服务器可以是具有计算能力、存储能力、数据处理能力的电子设备。一些场景中,服务器还可以为转发服务器。
67.在图1所示的数据传输场景中,可能存在多个客户端同时与服务器进行数据传输,即,这些数据传输场景具有高并发的数据传输需求。在具有高并发需求的场景中,采用传输控制协议(transmission control protocol,tcp)进行数据传输是比较成熟的解决方案。
68.tcp协议是一种面向连接的、可靠的、基于字节流的传输层通信协议,支持多路复用和异步处理。其中,多路复用是指,从源主机的不同套接字中收集数据块,并为每个数据块封装上首部信息(这将在多路分解时使用)从而生成报文段,然后将报文段传递到网络层。tcp天然的连接性使得服务器可以为每个客户端维护一个tcp连接,并绑定不同的套接字(socket),这样,tcp服务器可以分别通过不同的套接字与不同的客户端进行数据传输,从而满足多个客户端高并发的数据传输需求。
69.然而,在一些网络质量较差(例如存在网络丢包或者网络抖动等)的场景中,tcp协议的可靠性会导致数据传输的实时性变差,从而无法保证数据传输的实时性。
70.为了保证数据传输的实时性,通常采用用户数据报协议(user datagram protocol,udp)进行数据传输。udp协议是一种支持无连接的传输协议,为应用程序提供了
一种无需建立连接就可以发送封装的ip数据报的方法。特别适用于实时数据传输场景,例如,实时视频的传输。
71.但是,采用udp协议时,服务器只能通过同一个套接字与所有的客户端进行通信,无法满足高并发的数据传输需求。
72.一种相关技术中,针对支持多核cpu资源的服务器,可以采用udp多线程处理。具体的,可以预先创建多个线程,针对每个线程都创建一个或多个udp socket。这样利用linux内核的udp socket查找算法来达到udp的多进程负载均衡。然而,这完全依赖于linux内核在处理udp socket时的查找算法。由于无法获知该查找算法的具体实现,因此该查找算法能否做到不同的udp socket之间的负载均衡是一个未知的问题。另外,也无法保证其它的系统或者未来的linux内核不会对算法处理过程进行改变。因此,上述利用linux内核的查找算法来实现的udp多线程处理具有较多的未知性。
73.为此,本技术实施例提供了一种基于udp的数据传输方法,无需利用linux内核的查找算法,实现对udp的多线程处理,在保证实时传输的情况下,满足高并发的数据传输需求。
74.下面以具体地实施例对本技术的技术方案进行详细说明。下面这几个具体的实施例可以相互结合,对于相同或相似的概念或过程可能在某些实施例不再赘述。
75.图2为本技术一个实施例提供的基于udp的数据传输方法的流程示意图。本实施例的方法可以由图1中的服务器执行。如图2所示,本实施例的方法,可以包括:
76.s201:通过第一线程对第一socket进行监听,获取通过第一socket接收到的第一数据包。
77.本实施例中,第一socket是指服务器创建的用于接收所有客户端发送的第一个数据包的套接字。第一socket工作在第一线程中,通过第一线程对第一socket进行监听。第一线程还可以称为网络线程,只用于监听所有客户端发送的第一个数据包。
78.第一数据包是指由客户端向服务器发送的第一个数据包。在服务器接收到某个客户端发送的第一数据包之后,服务器与该客户端之间传输的后续数据包被称为第二数据包。应理解,第二数据包可以是客户端向服务器发送的除第一数据包之外的后续数据包,还可以是服务器向客户端发送的数据包。
79.应理解,如无特殊说明,本技术实施例中涉及的socket均指的是udp socket,数据包均指的是udp数据包。
80.s202:从第一数据包中获取第一客户端的地址信息,所述第一客户端为发送所述第一数据包的客户端。
81.基于udp的数据传输中,客户端向服务器发送数据包时,会在数据包中携带客户端的地址信息。因此,服务器接收到第一数据包后,可以从第一数据包中获取到发送该第一数据包的客户端的地址信息。为了描述方便,本实施例中,将发送第一数据包的客户端称为第一客户端,第一客户端也可以称为源客户端。
82.s203:创建第二socket,根据所述地址信息将所述第二socket连接至所述第一客户端,并通过第二线程对所述第二socket进行监听,所述第二socket用于与所述第一客户端进行第二数据包的传输。
83.本实施例中,服务器每次接收到第一数据包后,都会创建一个新的socket。为了描
述方便,将该新创建的socket称为第二socket。根据从第一数据包中获取的第一客户端的地址信息,将第二socket连接至第一客户端。这样,第二socket用于在服务器与第一客户端之间进行第二数据包的传输。例如,服务器可以通过该第二socket接收第一客户端发送的第二数据包,或者,服务器可以通过该第二socket向第一客户端发送第二数据包。
84.能够理解,服务器对第一客户端创建第二socket,并将第二socket连接至第一客户端之后,通过第二socket实现与第一客户端之间的后续数据包的传输。这样,第一socket不会再接收到该第一客户端的其他数据包。因此,第一socket只用于接收每个客户端发送的第一个数据包。
85.由于在第一socket接收到每个客户端发送的第一个数据包之后,服务器为该客户端新创建一个第二socket,通过该第二socket来传输该客户端与服务器之间的后续数据包。这样,每个客户端均对应一个第二socket。当多个客户端并发式地与服务器进行数据传输时,服务器通过与每个客户端各自对应的第二socket来传输数据,实现了多个客户端之间的并行处理,因此,可以满足高并发的数据传输需求。
86.进一步的,本实施例中,服务器创建第二socket后,通过第二线程对第二socket进行监听。其中,第二线程也可以称为工作线程,用于对客户端发送的除第一数据包之外的后续数据包(即第二数据包)进行监听。示例性的,当通过第二线程监听到第二数据包时,对第二数据包进行处理或者转发。
87.需要说明的是,本实施例中,第二线程的数量可以有一个或者多个。例如,当第二线程的数量有一个时,通过该第二线程对所有客户端的第二socket进行监听。当第二线程的数量有多个时,可以使用一个第二线程监听一个客户端的第二socket,也可以使用一个第二线程监听多个客户端的第二socket。本实施例对此不作限定。
88.由于本实施例中第一线程用于对第一socket进行监听,第二线程用于第二socket进行监听,因此,通过不同的线程即可自然区分出服务器接收到的数据包为第一数据包或第二数据包。示例性的,当服务器通过第一线程接收到数据包时,则可以直接确定该数据包为某个客户端发送的第一数据包,并执行为该客户端创建第二socket的步骤。当服务器通过第二线程接收到数据包时,则可以直接确定该数据包为某个客户端发送的第二数据包,执行对该第二数据包进行处理或者转发的步骤。可见,本实施例中,无需再针对接收到数据包的socket进行额外判断,能够提高数据传输效率。
89.本实施例提供的基于udp的数据传输方法,包括:通过第一线程对第一socket进行监听,获取通过第一socket接收到的第一数据包,从第一数据包中获取发送该第一数据包的第一客户端的地址信息,创建第二socket,根据所述地址信息将第二socket连接至第一客户端,并通过第二线程对第二socket进行监听,以通过第二socket与第一客户端进行第二数据包的传输。通过上述过程,实现了每个客户端均对应一个第二socket。当多个客户端并发式地与服务器进行数据传输时,服务器通过与每个客户端各自对应的第二socket来传输数据,实现了多个客户端之间的并行处理,因此,可以满足高并发的数据传输需求。另外,本实施例通过第一线程对第一socket进行监听,通过第二线程对第二socket进行监听,使得根据监听到数据包的线程即可自然区分出接收到的数据包为第一数据包或第二数据包,无需再针对接收到数据包的socket进行额外判断,能够提高数据传输效率,保证数据传输的实时性。
90.在图2所示实施例的基础上,由于服务器为每个客户端均创建了一个第二socket,即,与tcp协议类似,相当于服务器为每个客户端都创建了一个虚拟的“连接”与之对应,因此,可以借用tcp协议的epoll事件监听机制。
91.epoll使用了内核文件级别的回调机制,可以对多个socket进行监听,并针对每个socket设置事件监听信息。epoll采用事件通知方式,每当socket被内核io事件异步唤醒,系统注册的回调函数就会被调用,将被唤醒的socket放到预设队列(例如ready队列)中。这样,epoll获取事件的时候,无须遍历全部被监听的socket,只要遍历那些被加入预设队列的socket即可。epoll机制能够提高并发处理的性能,从而充分利用服务器的cpu资源。
92.示例性的,本实施例中的第二线程可以采用epoll事件监听机制。通过第二线程对第二socket进行监听,可以包括:将第二socket加入与该第二线程对应的epoll的监听队列,通过epoll对第二socket是否接收到数据进行监听。能够理解,在第二线程负责监听多个客户端的第二socket的情况下,通过采用epoll机制,能够显著提高大量并发连接中只有少量活跃的情况下的系统cpu利用率。
93.可选的,本实施例中的第一线程也可以采用epoll事件监听机制,从而进一步提高cpu资源的利用率。
94.下面结合图3所示的实施例进行描述。图3为本技术另一个实施例提供的基于udp的数据传输方法的流程示意图。如图3所示,本实施例的方法可以包括:
95.s301:创建第一socket。
96.示例性的,服务器创建第一socket,假设第一socket的描述符为listenfd。在创建第一socket时,还可以设置第一socket的属性为reuseaddr和reuseport。例如,创建第一socket可以采用socket()函数实现。
97.进而,还可以创建套字节地址,该套接字地址绑定服务器的所有网卡,并将第一socket绑定在该套字节地址上。例如,对第一socket进行地址绑定可以采用bind()函数实现。
98.s302:创建第一线程,以及与第一线程对应的epoll,将第一socket加入与第一线程对应的epoll的监听队列,并通过第一线程对应的epoll对第一socket进行监听。
99.示例性的,服务器创建第一线程,并创建一个epoll的句柄,假设该epoll的句柄为epollfd。例如,可以通过epoll_create()函数创建epoll句柄,该函数的参数可以指定要监听的socket描述符的数量,该数量可以根据业务需求设置。epoll_create()函数调用成功时的返回值即为新创建epoll的句柄epollfd。
100.进而,可以通过epoll_ctl()函数将第一socket(即listenfd)加入到第一线程对应的epoll(即epollfd)的监听队列。在将第一socket加入监听队列时,还可以设置该第一socket对应的事件监听信息。示例性的,第一socket对应的事件监听信息可以包括:可读事件、水平触发(level triggered)模式、边缘触发(edge triggered)模式等。
101.然后,可以通过epoll_wait()函数等待事件的产生。本实施例中,可以在第一线程中对epoll_wait()函数进行迭代,从而实现第一线程对第一socket的监听。
102.s303:创建线程池,线程池中包括多个第二线程,分别创建与每个第二线程对应的epoll。
103.示例性的,服务器创建包括多个第二线程的线程池。其中,第二线程的数量可以根
据业务场景进行设置。并针对每个第二线程,创建与其对应的epoll。
104.应理解,每个第二线程对应的epoll的创建过程与第一线程对应的epoll的创建过程类似,此处不作赘述。进一步的,可以在每个第二线程中对epoll_wait()函数进行迭代,这样,当第二线程对应的epoll的监听队列中被加入一个或者多个socket时,第二线程可以实现对这些socket的监听。
105.s304:获取通过第一socket接收到的第一数据包。
106.本实施例中,第一线程中的epoll_wait()用于等待第一socket的事件。若第一线程中的epoll_wait()的返回值大于0时,根据epoll_wait()的回调结果获取第一socket接收到的第一数据包。
107.例如,可以通过调用recvfrom()函数接收第一数据包。能够理解,该第一数据包为某个客户端发送的第一个数据包。
108.s305:从第一数据包中获取第一客户端的地址信息,第一客户端为发送第一数据包的客户端。
109.示例性的,从recvfrom()返回的第一数据包中获取第一客户端的套字节地址。
110.s306:创建第二socket,根据所述地址信息将第二socket连接至第一客户端,第一socket用于在服务器与第一客户端之间进行第二数据包的传输。
111.示例性的,服务器创建一个新的第二socket,假设第二socket的描述符为clientfd。在创建第二socket时,还可以设置第二socket的属性为reuseaddr和reuseport。进而,还可以创建套字节地址,该套接字地址绑定服务器的所有网卡,并将第二socket绑定在该套字节地址上。与第一socket的创建过程类似,上述过程可以采用socket()函数和bind()函数实现。
112.然后,将第二socket连接至第一客户端。例如,可以通过connect()函数将第二socket与第一客户端的地址信息连接。
113.s307:根据预设的哈希规则,从线程池包括的多个第二线程中,确定用于监听第二socket的目标第二线程。
114.由于线程池中包括多个第二线程,可以根据预设的哈希规则,将上述新创建的第二socket关联至某一个第二线程。其中,哈希规则指示的是第二socket与第二线程之间的映射关系。哈希规则可以有多种设置方式,本实施例对此不作限定。
115.可选的,可以通过对第二socket的描述符clientfd进行哈希计算,确定出用于监听第二socket的目标第二线程。例如,一种可能的哈希规则可以为:目标第二线程thread_i=第二socket的描述符clientfd%第二线程的总数。
116.s308:将第二socket加入与目标第二线程对应的epoll的监听队列,通过目标第二线程对第二socket进行监听。
117.示例性的,可以生成第二socket对应的事件监听信息。所述事件监听信息用于指示对第二socket的预设事件进行监听。例如,第二socket对应的事件监听信息可以包括:可读事件、水平触发(level triggered)模式、边缘触发(edge triggered)模式等。进而,将第二socket以及该事件监听信息加入与目标第二线程对应的epoll的监听队列。
118.例如,可以通过epoll_ctl()函数将第二socket(即clientfd)以及事件监听信息加入到目标第二线程对应的epoll的监听队列。
119.能够理解,将第二socket加入目标第二线程对应的epoll的监听队列后,目标第二线程通过epoll_wait()函数实现对第二socket的监听。
120.本实施例中,第一线程和每个第二线程均采用epoll机制,在满足高并发数据传输需求的情况下,还最大程度的提升了服务器的cpu利用率。
121.在上述实施例的基础上,下面结合一个具体的实例对并发场景下的数据传输过程进行描述。
122.图4a至图4g为本技术实施例提供的数据传输过程的示意图。请参加图4a,假设服务器创建了第一socket、第一线程以及第一线程对应的epoll,并且第一socket被加入第一线程对应的epoll的监听队列,即,采用epoll对第一socket进行监听。另外,服务器还创建了线程池,假设线程池中包括3个第二线程,分别为:第二线程a、第二线程b、第二线程c,并且,还创建了每个第二线程对应的epoll。如图4a所示,初始状态下,每个第二线程对应的epoll的监听队列为空。
123.假设服务器通过第一线程对应的epoll监听到数据包1(即,第一数据包),该数据包1是由客户端1发送的,则服务器创建客户端1对应的第二socket,并将客户端1对应的第二socket加入第二线程a对应的epoll的监听队列。如图4b所示,第二线程a对应的epoll的监听队列中包括:客户端1对应的第二socket。即,采用第二线程a对应的epoll对客户端1对应的第二socket进行监听。
124.进一步的,假设服务器通过第一线程对应的epoll监听到数据包2(即,第一数据包),该数据包2是由客户端2发送的,则服务器创建客户端2对应的第二socket,并将客户端2对应的第二socket加入第二线程b对应的epoll的监听队列。如图4c所示,第二线程b对应的epoll的监听队列中包括:客户端2对应的第二socket。即,采用第二线程b对应的epoll对客户端2对应的第二socket进行监听。
125.进一步的,假设服务器通过第一线程对应的epoll监听到数据包3(即,第一数据包),该数据包3是由客户端3发送的,则服务器创建客户端3对应的第二socket,并将客户端3对应的第二socket加入第二线程c对应的epoll的监听队列。如图4d所示,第二线程c对应的epoll的监听队列中包括:客户端3对应的第二socket。即,采用第二线程c对应的epoll对客户端3对应的第二socket进行监听。
126.进一步的,假设服务器通过第一线程对应的epoll监听到数据包4(即,第一数据包),该数据包4是由客户端4发送的,则服务器创建客户端4对应的第二socket,并将客户端4对应的第二socket加入第二线程a对应的epoll的监听队列。如图4e所示,第二线程a对应的epoll的监听队列中包括:客户端1对应的第二socket、客户端4对应的第二socket。即,采用第二线程a对应的epoll对客户端1、客户端4对应的第二socket进行监听。
127.进一步的,假设服务器通过第一线程对应的epoll监听到数据包5(即,第一数据包),该数据包5是由客户端5发送的,则服务器创建客户端5对应的第二socket,并将客户端5对应的第二socket加入第二线程b对应的epoll的监听队列。如图4f所示,第二线程b对应的epoll的监听队列中包括:客户端2对应的第二socket、客户端5对应的第二socket。即,采用第二线程b对应的epoll对客户端2、客户端5对应的第二socket进行监听。
128.一些可能的场景中,当服务器为非转发服务器时,服务器通过某个第二线程接收到客户端发送的第二数据包后,可以对第二数据包进行处理。例如,服务器通过第二线程a
接收到客户端1或者客户端4发送的第二数据包后,通过第二线程a对第二数据包进行处理。或者,服务器通过第二线程b接收到客户端2或客户端5发送的第二数据包后,通过第二线程b对第二数据包进行处理。或者,服务器通过第二线程c接收到客户端3发送的第二数据包后,通过第二线程c对第二数据包进行处理。
129.另一些可能的场景中,当服务器为转发服务器时,服务器还可以实现不同客户端之间的数据转发功能。下面对转发场景的数据传输过程进行描述。
130.具体的,服务器通过第一socket接收到第一数据包后,可以从第一数据包中获取第一客户端的地址信息和第二客户端的地址信息,第一客户端为第一数据包对应的源客户端,第二客户端为第一数据包对应的目的客户端。这样,服务器在创建第二socket后,将第二socket连接至第一客户端。从线程池中确定一个目标第二线程,将第二socket加入目标第二线程对应的epoll的监听队列,并在第二socket对应的事件监听信息中携带第二客户端的地址信息。这样,目标第二线程通过该第二sokcet从第一客户端接收到的数据包后,会将数据包转发给第二客户端。
131.例如,在图4f的基础上,假设服务器通过第一线程对应的epoll1监听到数据包6(即,第一数据包),该数据包6是由客户端6发送给客户端4的,则服务器接收到数据包6后,创建客户端6对应的第二socket,并将客户端6对应的第二socket加入第二线程c对应的epoll的监听队列。并且,在第二socket对应的事件监听信息中携带客户端4的地址信息(例如,客户端4的套接字地址)。如图4g所示,第二线程c对应的epoll的监听队列中包括:客户端3对应的第二socket、客户端6对应的第二socket。即,采用第二线程c对应的epoll对客户端3、客户端6对应的第二socket进行监听。
132.进一步的,假设服务器通过第二线程c对应的epoll从客户端6接收到数据包7(即,第二数据包),服务器通过epoll回调函数获取到目的客户端的地址信息(即客户端4的套接字地址),并将数据包7发送给客户端4。
133.应理解,上述转发场景中,是以第二数据包对应一个目的客户端为例进行示意的,实际应用中,第二数据包对应的目的客户端的数量还可以是多个,本实施例对此不作限定。
134.图5为本技术一个实施例提供的基于udp的数据传输装置的结构示意图。该装置可以为软件和/或硬件的形式。如图5所示,本实施例提供的基于udp的数据传输装置10,可以包括:获取模块11和处理模块12。
135.其中,获取模块11,用于通过第一线程对第一套接字socket进行监听,获取通过所述第一socket接收到的第一数据包;
136.处理模块12,用于从所述第一数据包中获取第一客户端的地址信息,所述第一客户端为发送所述第一数据包的客户端;
137.所述处理模块12,还用于创建第二socket,根据所述地址信息将所述第二socket连接至所述第一客户端,并通过第二线程对所述第二socket进行监听,所述第二socket用于与所述第一客户端进行第二数据包的传输。
138.一种可能的实现方式中,所述第二线程采用epoll事件监听机制;所述处理模块12具体用于:
139.将所述第二socket加入与所述第二线程对应的epoll的监听队列。
140.一种可能的实现方式中,所述处理模块12具体用于:
141.根据预设的哈希规则,从线程池包括的多个第二线程中,确定用于监听所述第二socket的目标第二线程;
142.将所述第二socket加入与所述目标第二线程对应的epoll的监听队列。
143.一种可能的实现方式中,所述处理模块12还用于:
144.从所述第一数据包中获取第二客户端的地址信息,所述第二客户端为需要接收所述第一数据包的客户端;
145.生成与所述第二socket对应的事件监听信息,所述事件监听信息用于指示对所述第二socket的预设事件进行监听,所述预设事件的参数包括所述第二客户端的地址信息;
146.将所述第二socket以及所述事件监听信息加入与所述目标第二线程对应的epoll的监听队列。
147.一种可能的实现方式中,所述获取模块11还用于:通过所述目标第二线程,获取由所述第二socket接收到的所述第二数据包;
148.所述处理模块12还用于:根据与所述第二socket对应的事件监听信息,确定所述第二数据包对应的第二客户端的地址信息,并将所述第二数据包发送至所述第二客户端。
149.图6为本技术另一个实施例提供的基于udp的数据传输装置的结构示意图,在图5所示实施例的基础上,本实施例提供的基于udp的数据传输装置10还可以包括:创建模块13。
150.一种可能的实现方式中,所述创建模块13用于:
151.创建所述第一socket;
152.创建所述第一线程,以及与所述第一线程对应的epoll,将所述第一socket加入与所述第一线程对应的epoll的监听队列。
153.一种可能的实现方式中,所述创建模块13还用于:
154.创建所述线程池,所述线程池中包括多个第二线程;
155.分别创建与每个所述第二线程对应的epoll。
156.本技术实施例提供的基于udp的数据传输装置可用于执行上述任一方法实施例中的技术方案,其实现原理和技术效果类似,此处不作赘述。
157.图7为本技术实施例提供的电子设备的结构示意图。该电子设备可以作为图1中的服务器。如图7所示,本实施例的电子设备70,包括:
158.处理器71以及存储器72;其中,存储器72,用于存储计算机程序;处理器71,用于执行存储器存储的计算机程序,以实现上述实施例中的基于udp的数据传输方法。具体可以参见前述方法实施例中的相关描述。可选地,存储器72既可以是独立的,也可以跟处理器71集成在一起。
159.当所述存储器72是独立于处理器71之外的器件时,所述电子设备70还可以包括:总线73,用于连接所述存储器72和处理器71。
160.可选的,电子设备70还可以包括通信部件74,用于与客户端进行通信。
161.本实施例提供的电子设备,可用于执行上述任一方法实施例中的技术方案,其实现原理和技术效果类似,本实施例此处不再赘述。
162.本技术实施例还提供一种计算机可读存储介质,所述计算机可读存储介质包括计算机程序,所述计算机程序用于实现如上任一方法实施例中的技术方案。
163.本技术实施例还提供一种芯片,包括:存储器、处理器以及计算机程序,所述计算机程序存储在所述存储器中,所述处理器运行所述计算机程序执行上述任一方法实施例中的技术方案。
164.在本技术所提供的几个实施例中,应该理解到,所揭露的设备和方法,可以通过其它的方式实现。例如,以上所描述的设备实施例仅仅是示意性的,例如,所述模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个模块可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或模块的间接耦合或通信连接,可以是电性,机械或其它的形式。
165.所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,作为模块显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。
166.另外,在本技术各个实施例中的各功能模块可以集成在一个处理单元中,也可以是各个模块单独物理存在,也可以两个或两个以上模块集成在一个单元中。上述模块成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
167.上述以软件功能模块的形式实现的集成的模块,可以存储在一个计算机可读取存储介质中。上述软件功能模块存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器(英文:processor)执行本技术各个实施例所述方法的部分步骤。
168.应理解,上述处理器可以是中央处理单元(英文:central processing unit,简称:cpu),还可以是其他通用处理器、数字信号处理器(英文:digital signal processor,简称:dsp)、专用集成电路(英文:application specific integrated circuit,简称:asic)等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合申请所公开的方法的步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。
169.存储器可能包含高速ram存储器,也可能还包括非易失性存储nvm,例如至少一个磁盘存储器,还可以为u盘、移动硬盘、只读存储器、磁盘或光盘等。
170.总线可以是工业标准体系结构(industry standard architecture,isa)总线、外部设备互连(peripheral component,pci)总线或扩展工业标准体系结构(extended industry standard architecture,eisa)总线等。总线可以分为地址总线、数据总线、控制总线等。为便于表示,本技术附图中的总线并不限定仅有一根总线或一种类型的总线。
171.上述存储介质可以是由任何类型的易失性或非易失性存储设备或者它们的组合实现,如静态随机存取存储器(sram),电可擦除可编程只读存储器(eeprom),可擦除可编程只读存储器(eprom),可编程只读存储器(prom),只读存储器(rom),磁存储器,快闪存储器,磁盘或光盘。存储介质可以是通用或专用计算机能够存取的任何可用介质。
172.一种示例性的存储介质耦合至处理器,从而使处理器能够从该存储介质读取信息,且可向该存储介质写入信息。当然,存储介质也可以是处理器的组成部分。处理器和存储介质可以位于专用集成电路(application specific integrated circuits,简称:
asic)中。当然,处理器和存储介质也可以作为分立组件存在于电子设备或主控设备中。
173.本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:rom、ram、磁碟或者光盘等各种可以存储程序代码的介质。
174.最后应说明的是:以上各实施例仅用以说明本技术的技术方案,而非对其限制;尽管参照前述各实施例对本技术进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本技术各实施例技术方案的范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1