當前位置:首頁 » 硬碟大全 » udp怎麼接收緩存
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

udp怎麼接收緩存

發布時間: 2022-07-16 06:36:02

❶ 如何 監聽,接收 所有UDP埠 數據

12埠就用12個線程去接收。 但處理都是一樣的吧。
所以要有個事件 比如定義一個事件
public delegate void DataArrivalHandler(byte[] data);參數你定,或者(Stream s)之類,也可以是自定一個類(包含其它信息)繼承EventArgs寫個 (DataEventArgs e)
public event DataArrivalHandler OnDataArrived;
OnDataArrived+=()這里注冊相應的方法,如果不同埠的處理不一樣,就相應寫不同的事件,當然也可以只定義一個方法,方法根據不同的埠處理。
while(true)
{
byte[] data = (獲取)
這里獲取數據後,直接調用
OnDataArrived(data)/OnDataArrived(stream)/OnDataArrived(new DataEventArgs (data,ip,port)之類,根據你定義的參數來。
}
而注冊的方法里的具體實現,用委託非同步調用. 方法體里執行
{
namedDelegate.beginEnvoke();
}
這樣,數據處理就非同步完成了。
避免數據丟失的話,做個保險。 把接收的數據放入定義的緩沖塊里。 當接收的數據量到達一定程序後,取出部分處理,再加入新數據。
類似於TCP的的滑動窗口。 麻煩點,但實現了,效果會好的多。
--------------------------
為什麼要用ThreadPool? 不便於控制狀態。 當你的線程處理的業務非常單一時用它,這種情況需要不需額外的狀態信息,比如就像你上面的每次有不同的byte[] data。
直接 new ThreadStart();

❷ java使用UDP 如果我定義了一個1024byte的緩存,而接收到的只有16個byte剩餘的怎麼處理

byte[] b = new byte[1024];
int len = 輸入流.read(b)://從輸入流中讀取數據裝填到數組b中,len保存的是讀到的有效位元組數
while( len != - 1 ){ //為-1表示沒有數據可讀
String str = new String(b, 0, len); //把裝數字的數組中本次讀到的數據new成string
或者
輸出流.write( b, 0, len); //向輸出流中寫len個位元組數據。剩下的你不用管它。
}
記住,len記錄了每次讀到的有效位元組個數,如果接收的只有16個,那麼你只用取16個拿出來用,就是准確的數據。

❸ 請教Linux關於UDP最大緩沖區設置

1. tcp 收發緩沖區默認值 [root@ ]# cat /proc/sys/net/ipv4/tcp_rmem 4096 87380 4161536 87380 :tcp接收緩沖區的默認值 [root@ ]# cat /proc/sys/net/ipv4/tcp_wmem 4096 16384 4161536 16384 : tcp 發送緩沖區的默認值 2. tcp 或udp收發緩沖區最大值 [root@ ]# cat /proc/sys/net/core/rmem_max 131071 131071:tcp 或 udp 接收緩沖區最大可設置值的一半。 也就是說調用 setsockopt(s, SOL_SOCKET, SO_RCVBUF, &rcv_size, &optlen); 時rcv_size 如果超過 131071,那麼 getsockopt(s, SOL_SOCKET, SO_RCVBUF, &rcv_size, &optlen); 去到的值就等於 131071 * 2 = 262142 [root@ ]# cat /proc/sys/net/core/wmem_max 131071 131071:tcp 或 udp 發送緩沖區最大可設置值得一半。 跟上面同一個道理 3. udp收發緩沖區默認值 [root@ ]# cat /proc/sys/net/core/rmem_default 111616:udp接收緩沖區的默認值 [root@ ]# cat /proc/sys/net/core/wmem_default 111616 111616:udp發送緩沖區的默認值 4. tcp 或udp收發緩沖區最小值 tcp 或udp接收緩沖區的最小值為 256 bytes,由內核的宏決定; tcp 或udp發送緩沖區的最小值為 2048 bytes,由內核的宏決定

❹ linux下怎麼設置udp接收緩存最大值

vi /etc/sysctl.conf
增加或修改 net.ipv4.udp_mem項
net.ipv4.udp_mem = min pressure max
再設一下 net.ipv4.udp_rmem_min
具體含義man udp 查看
完成後執行 sysctl -p 生效

❺ C# udp是什麼意思啊,是干什麼的啊

最普遍的介紹:

UDP 是User Datagram Protocol的簡稱, 中文名是用戶數據包協議,是一種無連接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務。UDP是與TCP相對應的協議,它是面向非連接的協議,它不與對方連接,而直接把數據包發送過去。「面向非連接」就是正式通信前不必與對方建立連接,不管對方狀態就直接發送。

特點是什麼:

(1)UDP是一個無連接協議,傳輸數據之前,源端和終端不建立連接,當它想傳送時就簡單的抓取來自應用程序的數據,並盡可能快的把他扔到網路上。在發送端UDP傳送的速度僅僅是受應用程序數據生成的速度、計算機能力和傳輸帶寬限制;在接收端,UDP把每個消息段放在隊列中,應用程序每次從隊列中讀取一個消息段。

(2)由於傳輸數據不建立連接,因此也就不需要維護連接狀態,包括收發狀態等,因此一台服務機可同時向多台客戶機傳輸相同的信息。

(3)UDP信息包的標題很短,只有8個位元組,相對於TCP的20個位元組信息包的額外開銷很小。

(4)吞吐量不受擁擠控制演算法的調節,只受應用軟體生成數據的速率、傳輸寬頻、源端和終端主機性能的限制。

(5)UDP使用盡量最大努力交付,即不保證可靠交付,因此主機不需要維持復雜的鏈接狀態表(該表中有許多參數)。

(6)UDP是面向報文的。發送方對應用程序交下來的報文,在添加首部後就向下交付個IP層。既不拆分,也不合並,而是保留這些報文的邊界,因此,應用程序需要選擇合適的報文大小。

舉例說明應用場景:

一般用於實時視頻通訊,例如QQ

實時音視頻是可以而且應該用 UDP 的,一方面因為它常常涉及到網路穿透,另外一方面它不需要重傳。——我需要實時的看到你的圖像跟聲音,至於中間丟一幀什麼的完全不重要。而為了重傳往往會造成延遲與不同步,考慮一下,某一幀因為重傳,導致0.5秒以後才到,那麼整個音視頻就延遲了0.5秒。

考慮一下接收方看視頻,如果使用 TCP 導致視頻的中間延遲了0.5秒,只要我不按「快進」鍵,那麼後續的視頻全都會比發送方延遲0.5秒。這種延遲是累加的,隨著持續丟幀,延遲會越來越大,達到數秒,甚至分鍾級,這會嚴重影響實時音視頻的用戶體驗。

因此「實時音視頻聊天」功能通常都會使用 UDP 實現。

其它含義:

註:UDP比TCP更容易穿越路由器防火牆。

註:在互聯網技術中,UDP常用在緩存讀取,保存;用在監控或終端上報。

註:在選擇使用協議的時候,選擇UDP必須要謹慎。在網路質量令人十分不滿意的環境下,UDP協議數據包丟失會比較嚴重。但是由於UDP的特性:它不屬於連接型協議,因而具有資源消耗小,處理速度快的優點,所以通常音頻、視頻和普通數據在傳送時使用UDP較多,因為它們即使偶爾丟失一兩個數據包,也不會對接收結果產生太大影響。比如我們聊天用的ICQ和QQ就是使用的UDP協議。

❻ UDP中將struct skb_buff作為緩存區 具體如何使用

一. SKB_BUFF的基本概念
1. 一個完整的skb buff組成
(1) struct sk_buff--用於維護socket buffer狀態和描述信息
(2) header data--獨立於sk_buff結構體的數據緩沖區,用來存放報文分組,使各層協議的header存儲在連續的空間中,以方便協議棧對其操作
(3) struct skb_shared_info --作為header data的補充,用於存儲ip分片,其中sk_buff *frag_list是一系列子skbuff鏈表,而frag[]是由一組單獨的page組成的數據緩沖區

❼ java 怎麼用UDP實時接收數據

我自己寫的代碼:

importjava.io.IOException;
importjava.net.DatagramPacket;
importjava.net.DatagramSocket;
importjava.net.InetAddress;
importjava.net.SocketException;
importjava.net.UnknownHostException;
publicclassUdpRecvDemo
{

publicstaticvoidmain(String[]args)throwsIOException
{
Recv();
}

publicstaticvoidRecv()throwsIOException
{
System.out.println("接受開始......");
DatagramSocketds=newDatagramSocket(3388);
while(true)
{
byte[]buf=newbyte[1024];
DatagramPacketdp=newDatagramPacket(buf,buf.length);
ds.receive(dp);
System.out.println(ds);
Stringip=dp.getAddress().getHostAddress();
intport=dp.getPort();
Stringtext=newString(dp.getData(),0,dp.getLength());
if(text.equals("exit"))
{
System.out.println(ip+"退出會話......");
break;
}
System.out.println(ip+":"+port+"===>me"+text);
}

ds.close();
}
}

❽ 怎麼給每個 UDP SOCKET 設置一個接收緩沖區,MFC/C++

用clist<SOCKET ,&> .....

❾ 請教lwip udp數據接收緩存大小如何設置

在VB中利用UDP協議編寫聊天程序UDP 協議是一種無連接協議,兩台計算機之間的數據傳輸類似於傳遞郵件:消息從一台計算機發送到另一台計算機,但是兩者之間沒有明確的連接。 由於UDP 協議不需要顯式的連接,就需要在兩個Winsock控制項中間發送數據