导航:首页 > 配服务器 > udp服务器大量连接如何管理

udp服务器大量连接如何管理

发布时间:2022-04-24 12:05:24

1. 客户端使用UDP协议不停的向服务器发送数据,Java这边需要存储这些数据并进行处理,如何监控这个数据

2个方法,设置2个变量分别记载当前处理的queue下标A,(假设你的queue是结构体数组长度200),还有个表量记载还没有操作的总数B。
1.保证每个数据都接收。即时没有处理完也接收,循环加,从0-199再循环,另一个线程处理,从当前标记A开始往下处理,没处理完一个A+1 B-1,接收线程没接收一个B+1,B一直循环,QUEUE[B]接收数据,一定要注意,这2个变量和你的数组要加锁,防止2个线程同时被修改
2.保证处理,如果没处理完就不接收,加到B到上限就停止,但数据也是循环的存储,其他方法和上面一样,就是要注意加锁
以上说的方法是数据先进先出,如果想做先进后出的话,就每次处理当前A的数据,然后向前回溯就可以了

2. UDP连接方式详解

服务器端(接收端)程序:
1、创建套接字(socket)。
2、将套接字绑定到一个本地地址和端口上(bind)。
3、等待接收数据(recvfrom)。
4、关闭套接字。

客户端(发送端)程序:
1、创建套接字(socket)。
2、向服务器发送数据(sendto)。
3、关闭套接字。
client.c#include <Winsock2.h>#include <stdio.h>void main(){ WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 1, 1 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) { return; } if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) { WSACleanup( ); return; } SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0); SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr=inet_addr("222.26.28.227"); addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(5001); sendto(sockClient,"Hello",strlen("Hello")+1,0, (SOCKADDR*)&addrSrv,sizeof(SOCKADDR));// printf("%d\n", sendto(sockClient,"Hello",strlen("Hello")+1,0,// (SOCKADDR*)&addrSrv,sizeof(SOCKADDR))); closesocket(sockClient); WSACleanup();}server.c#include <Winsock2.h>#include <stdio.h>void main(){ WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 1, 1 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) { return; } if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) { WSACleanup( ); return; } SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0); SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(5001); bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); SOCKADDR_IN addrClient; int len = sizeof(SOCKADDR);// int len=sizeof(addrClient); char recvBuf[100] = "\0"; printf("Wating for message from others: \n"); int a = recvfrom(sockSrv,recvBuf,100,0, (SOCKADDR*)&addrClient,&len); if(a == SOCKET_ERROR) { printf("Error\n"); printf("%s\n", WSAGetLastError()); } printf("%s\n",recvBuf); closesocket(sockSrv); WSACleanup();}

3. 我的linux服务器成肉鸡了,向同一ip地址发送大量的udp包,把我的服务器资源都消耗光了,怎么解决,

1连上服务器 找出发包进程kill掉(这一步做不到可以无视)
2数据备份(有重要数据的话)
3重做系统
4还原数据
5做好安全防护(iptables禁用不用的端口,不需要的服务关闭,升级bash最近有漏洞)

4. 如何解决UDP服务器高并发问题

很简单,上负载均衡啊

5. 一般的UDP服务器可以同时连接多少个客户端

你好;1:与N个客户端相连的话;服务器都有一个对应的socket;也就是N个
2:为什么TCP的C/S应用中,服务器程序要先于客户端程序执行 因为客户端要连接服务器之前先要知道服务器的IP地址和端口号 而且这个端口号是处于监听状态的;如果服务器不先启动 那么也不可能绑定这个端口号 客户端根本连接不上
而UDP的C/S应用中,客户端程序先于服务器程序执行?
如果是通过UDP协议的话;这个没有服务器和客户端之分 是相对独立的个体;如果我是客户端;我只要开启一个端口 绑定这个端口 那么人家知道我的IP地址和这个端口号 可以直接发信息给我 不用连接我;反之对方也一样 希望能帮到你

6. UDP 并发服务器,大家帮忙看一看!该如何解决

UDP2000个客户端左右 并发
单个数据包最大512字节
Internet 10MB带宽
要求效率(尽可能快,尽可能少丢包),这种情况下用哪种通讯模型比较有优势!
想用IOCP,因为和select模型相比,这个稍微熟悉一点,也在项目中用过,不过是TCP的。
有两个问题,大家懂得的帮忙给指导一下:
是否可以理解为UDP模式下,一次recvfrom 只对应一次sendto。
2.能否对服务端的套接字同时投递多个WsaRecvFrom,能否在多个线程中同时投递WsaSendTo和WsaRecvFrom。
------解决方案--------------------------------------------------------
-------------------------------------
等不到,包被截断了。
2.能否对服务端的套接字同时投递多个WsaRecvFrom,能否在多个线程中同时投递WsaSendTo和WsaRecvFrom。
--------------------------
其实,我个人认为对udp而言,不用iocp也可以满足。 首先sendto都是立即完成的,无需异步操作。而recvfrom可以只需阻塞一个线程就够了,不需要重叠操作。
------解决方案--------------------------------------------------------
用UDX协议最可靠,效率高,开发简单,非开源。
UDT开源,对于你这种2000客户,够用,开源。
------解决方案--------------------------------------------------------
1.sendto 10k,接受部分要么收到10k,要么全部丢失,不会出现部分收到的情况。
------解决方案--------------------------------------------------------
-------------------------------------
在局域网可以,公网,一般1K也收不到。
2.能否对服务端的套接字同时投递多个WsaRecvFrom,能否在多个线程中同时投递WsaSendTo和WsaRecvFrom。
--------------------------完全可以
------解决方案--------------------------------------------------------
1.如果UDP数据在传输过程中被分包,则你需要对数据包进行标识,已确保获取的包完整。一次recvfrom并不对应一次sendto,考虑UDP不可靠传输的因素。
2.不可以,因为sendto和recvfrom都是对同一个资源Socket进行操作。如果在多个线程中对同一个资源进行操作,如果不加锁的情况下,会非常可怕的。而且,如果你加锁了,其实还不如单线程操作。
按照你的需求最好还是采用UDP,不过可以考虑组播。
2.API调用完全没有问题。但是接到的数据可能和发送的数据次序不一样,这本身是UDP乱序特性决定了的。而且你发送方可能是多线程,从API层面来说,这些调用都是可以的,完全没有问题。但是给你接收方处理带来一系列问题。

7. UDP连接的问题

UDP只发送,不接受,那个东西是用在特殊的地方的。

8. UDP服务器是做什么用的

UDP服务器,就是首发数据,进行数据处理的。与TCP不同的是不用建立连接,直接调用recvfrom来收包。
开始就是基本的socket初始化地址什么的。
要求多个线程处理客户端命令,那recvfrom收包后,考虑把客户端的地址信息保存,便于sendto,对接收的数据包,交给线程进行处理,每个线程可以向一块共享内存、队列里写入收到的数据和对应的客户端信息,每次写的时候对这块共享资源加锁,多个线程对共享资源读是加锁,读完解锁,并开始处理数据。
处理完,用sendto发回去。
不是什么大项目。小程序而已。

9. 求教面向大规模连接的高并发网络模型,该如何处理

所谓并发服务器就是在同一个时刻可以处理来自多个客户端的请求;循环服务器是指服务器在同一时刻只可以响应一个客户端的请求。而且对于TCP和UDP套接字,这两种服务器的实现方式也有不同的特点。
1、TCP循环服务器:
首先TCP服务器接受一个客户端的连接请求,处理连接请求,在完成这个客户端的所有请求后断开连接,然后再接受下一个客户端的请求。创建TCP循环服务器的算法如下:

复制代码 代码如下:
socket(……); //创建一个TCP套接字
bind(……); //邦定公认的端口号
listen(……); //倾听客户端连接
while(1) //开始循环接收客户端连接
{
accept(……);//接收当前客户端的连接
while(1)
{ //处理当前客户端的请求
read(……);
process(……);
write(……);
}
close(……); //关闭当前客户端的连接,准备接收下一个客户端连接
}
TCP循环服务器一次只处理一个客户端的请求,如果有一个客户端占用服务器不放时,其它的客户机连接请求都得不到及时的响应。因此,TCP服务器一般很少用循环服务器模型的。
2、TCP并发服务器:
并发服务器的思想是每一个客户端的请求并不由服务器的主进程直接处理,而是服务器主进程创建一个子进程来处理。创建TCP并发服务器的算法如下:

复制代码 代码如下:
socket(……); //创建一个TCP套接字
bind(……); //邦定公认的端口号
listen(……);//倾听客户端连接
while(1) //开始循环接收客户端的接收
{
accept(……);//接收一个客户端的连接
if(fork(……)==0) //创建子进程
{
while(1)
{ //子进程处理某个客户端的连接
read(……);
process(……);
write(……);
}
close(……); //关闭子进程处理的客户端连接
exit(……) ;//终止该子进程
}
close(……); //父进程关闭连接套接字描述符,准备接收下一个客户端连接
}
TCP并发服务器可以解决TCP循环服务器客户端独占服务器的情况。但同时也带来了一个不小的问题,即响应客户机的请求,服务器要创建子进程来处理,而创建子进程是一种非常消耗资源的操作。
3、UDP循环服务器:
UDP服务器每次从套接字上读取一个客户端的数据报请求,处理接收到的UDP数据报,然后将结果返回给客户机。创建UDP循环服务器的算法如下:
1 socket(……); //创建一个数据报类型的套接字 2 bind(……); //邦定公认的短口号 3 while(1) //开始接收客户端的连接 4 { //接收和处理客户端的UDP数据报 5 recvfrom(……); 6 process(……); 7 sendto(……);//准备接收下一个客户机的数据报 8 }
消除行号
因为UDP是非面向连接的,没有一个客户端可以独占服务器。只要处理过程不是死循环,服务器对于每一个客户机的请求总是能够处理的。
UDP循环服务器在数据报流量过大时由于处理任务繁重可能造成客户技数据报丢失,但是因为UDP协议本身不保证数据报可靠到达,所以UDP协议是允许丢失数据报的。
鉴于以上两点,一般的UDP服务器采用循环方式4、UDP并发服务器把并发的概念应用UDP就得到了并发UDP服务器,和并发TCP服务器模型一样是创建子进程来处理的。
创建UDP并发服务器的算法如下:

复制代码 代码如下:
socket(……); //创建一个数据报类型的套接字
bind(……); //邦定公认的短口号
while(1) //开始接收客户端的连接
{ //接收和处理客户端的UDP数据报
recvfrom(……);
if(fork(……)==0) //创建子进程
{
rocess(……);
sendto(……);
}
}
除非服务器在处理客户端的请求所用的时间比较长以外,人们实际上很少用这种UDP并发服务器模型的。
4、多路复用I/O并发服务器:
创建子进程会带来系统资源的大量消耗,为了解决这个问题,采用多路复用I/O模型的并发服务器。采用select函数创建多路复用I/O模型的并发服务器的算法如下:
初始化(socket,bind,listen);

复制代码 代码如下:
while(1)
{
设置监听读写文件描述符(FD_*);
调用select;
如果是倾听套接字就绪,说明一个新的连接请求建立
{
建立连接(accept);
加入到监听文件描述符中去;
}
否则说明是一个已经连接过的描述符
{
进行操作(read或者write);
}
多路复用I/O可以解决资源限制问题,此模型实际上是将UDP循环模型用在了TCP上面。这也会带了一些问题,如由于服务器依次处理客户的请求,所以可能导致友的客户会等待很久。

10. 服务器的UDP通讯是什么

用户数据文报协议 (UDP) 是一个无连接协议。跟 TCP 的操作不同,计算机并不建立连接。另外 UDP 应用程序可以是客户机,也可以是服务器。

为了传输数据,首先要设置客户计算机的 LocalPort 属性。然后,服务器计算机只需将 RemoteHost 设置为客户计算机的 Internet 地址,并将 RemotePort 属性设置为跟客户计算机的 LocalPort 属性相同的端口,并调用 SendData 方法来着手发送信息。于是,客户计算机使用 DataArrival 事件内的 GetData 方法来获取已发送的信息。

阅读全文

与udp服务器大量连接如何管理相关的资料

热点内容
服务器四个网口是什么 浏览:647
压缩图片软件官方下载 浏览:34
单片机c语言2版 浏览:207
java16位md5 浏览:672
php输出调试 浏览:568
php增量备份数据库 浏览:300
re文件夹可以删除吗 浏览:207
程序员祭天用什么软件 浏览:715
成都五轴编程 浏览:386
奥运会直播用什么app看 浏览:631
pythontime对比 浏览:193
练身材app哪个好 浏览:391
软件加密处理 浏览:474
51单片机红外解码 浏览:114
闲老板app是什么 浏览:214
二年级正方形简单解压折纸 浏览:962
java字符串去除换行 浏览:297
东莞app团队哪个好 浏览:323
建筑考二建刷视频用什么app 浏览:236
取消纸质文件夹密码 浏览:773