導航:首頁 > 配伺服器 > 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伺服器大量連接如何管理相關的資料

熱點內容
建築考二建刷視頻用什麼app 瀏覽:233
取消紙質文件夾密碼 瀏覽:769
程序員級別提升 瀏覽:432
編譯運行後停止工作 瀏覽:779
白虎通pdf 瀏覽:673
linux開啟關閉埠 瀏覽:228
單片機加一個晶元 瀏覽:723
vs編譯方式 瀏覽:211
安卓的掌盟盒子可以查什麼 瀏覽:864
上下學app有什麼好處 瀏覽:363
程序員做信貸項目的好跳槽嗎 瀏覽:252
粘土伺服器的禮盒為什麼開不了 瀏覽:506
樂高機器人pdf 瀏覽:863
退出scala命令 瀏覽:366
不管什麼情況下軍人必須服從命令 瀏覽:267
雲計算和伺服器模式有什麼區別 瀏覽:524
s型增長速率演算法 瀏覽:979
c語言迷宮演算法入門 瀏覽:242
android列表動畫 瀏覽:363
外企演算法面試 瀏覽:323