Tag: udpclient

如何找到分配给UDP客户端的端口号(在.net / C#中)?

如果我使用创建套接字 var socket = new UdpClient(0,AddressFamily.InterNetwork); 然后我如何找到套接字的端口? 我可能很愚蠢,但我在MSDN / Google上没有运气(可能是因为星期五凌晨4点42分,太阳正在闪耀)。 背景: 我想要做的是找到一个开放的端口,然后向另一个进程报告,以便在该端口上向我转发消息。 可能有多个客户端,所以我不想使用固定端口。 谢谢。

UdpClient – 限制缓冲区?

我在C#中遇到了UdpClient问题。 我通过互联网在两个客户端之间传输音频。 在我的麦克风上,采样率为16khz,我发送带有音频的UDP数据包,每个数据包6400字节。 这些从未通过,除了最后的数据包,自从我关闭录音以来通常大约在1200-3400之间。 当我将采样率降低到8khz时,我发送3200字节有效载荷的数据包。 这些总是因某种原因而通过。 因此,基本上3200以上的任何东西都会被拙劣(没有测试确切的数字,但……)为什么这个呢? 我想也许UdpClient内部缓冲区太小或什么的? 由于我流音频数据包被频繁发送。 接收: private void audioReceive(IAsyncResult asyn) { try { byte[] temp = audioSock.EndReceive(asyn, ref this.serverEP); this.waveProvider.AddSamples(temp, 0, temp.Length); this.textbox_display.Text = this.textbox_display.Text + ” got bytes: ” + temp.Length; audioSock.BeginReceive(new AsyncCallback(audioReceive), null); } catch (Exception ez) { MessageBox.Show(“audioReceive: ” + this.textbox_nick.Text + ” ” +ez.ToString()); } } 我找不到任何明显的错误。 […]

(显然)正常关闭UDPClient使套接字被阻止

以下代码尽管显然关闭了UDP套接字,但仍然挂起并且无法重新连接到同一地址/端口。 这些是我使用的类变量: Thread t_listener; List XSensAvailablePorts; private volatile bool stopT_listener = false; volatile UdpClient listener; IPEndPoint groupEP; 我用一个处理Socket连接和监听的方法创建并启动一个新线程: private void startSocketButton_Click(object sender, RoutedEventArgs e) { stopT_listener = false; closeSocketButton.IsEnabled = true; startSocketButton.IsEnabled = false; t_listener = new Thread(UDPListener); t_listener.Name = “UDPListenerThread”; t_listener.Start(); } 方法如下(我在Receive上使用超时,以便在套接字上没有发送任何内容并且发出Stop不会Stop它): private void UDPListener() { int numberOfPorts = XSensAvailablePorts.Count(); int currAttempt = […]

如果我不调用UdpClient.Close()方法有什么缺点?

我有以下代码块,它会影响我的程序效率。 这里的问题是如果目标主机存在,一切正常。 但如果确实存在,执行时间太长。 最后,我发现“udp.Close()”占用了大部分执行时间。 如果我不调用close方法,效率很高。 任何人都可以帮我告诉我,如果我不调用close方法有什么缺点? 非常感谢你。 { // This is my code block, I need to execute it many many times. string ipAddress = Dns.GetHostAddresses(“joe-pc”).FirstOrDefault().ToString(); UdpClient udp = new UdpClient(ipAddress, Port); udp.Send(msg, msg.Length); udp.Close(); udp = null; }

如何在.NET中解析UDP数据包?

如何在.NET中解析UDP数据包? 我正在使用PCap.Net来捕获数据包,在这种情况下是UDP数据包,我可以通过(PcapDotNet.packets.Ethernet.IpV4.Udp)从PCap.net对象访问它。 我如何获取结果,Udp数据包,并解析这个? 特别是解封在UDP数据包中发生的DNS请求和响应。 有没有可以帮助的图书馆? 编辑 :更具体地说,我希望能够做的是从DNS响应中提取IP地址,并根据使用Wireshark的检查,它将通过: (a)输入:作为DNS响应的UDP数据包的有效负载 (b)处理:解析UDP数据包的DNS响应部分。 找到答案部分,在此查找答案记录,其类型为A(主机地址)[不是CNAME记录],然后使用此答案记录获取IP地址。 (c)返回:DNS响应的IP地址。

如何从任何IP和任何端口接收UDP数据包?

我想用C#的UdpClient来监听任何收到的UDP数据包。 我想从任何IP和任何端口接收数据包。 我尝试了以下方法: UdpClient udpClient = new UdpClient(0); IPEndPoint ep = new IPEndPoint(IPAddress.Any, 0); byte[] data = udpClient.Receive(ref ep); 但没有成功。 有谁知道什么是错的? 提前致谢!

UDP – 我可以发送两个数据报部分,并使接收端将它们组合成一个吗?

这可能是一个愚蠢的问题,但由于我对UDP相对较新,所以…如果我有两个独立的字节数组,我需要接收端作为一个大数组,例如: byte[] Array1 = {1,1,1} byte[] Array2 = {2,2,2} 我可以避免创建缓冲区并将每个数组复制到其中,然后发送该缓冲区,如下所示: byte[] Buffer= new byte[Array1.Length + Array2.Length]; Buffer.BlockCopy(Array1, 0, Buffer, 0, Array1.Length); Buffer.BlockCopy(Array2, 0, Buffer, Array1.Length, Array2.Length); udpClient.Send(Buffer, Buffer.Length); 因为如果两者都很大,并且数据速率很高,那么复制会占用很多系统资源……所以我可以告诉udpClient我正在启动UDP碎片,然后这样做: udpClient.ImStartingOneBigDatagram(); udpClient.Send(Array1, Array1.Length); udpClient.Send(Array2, Array2.Length); udpClient.ThatsAllFolks(); 并确保接收方获得: byte[] recv = {1,1,1,2,2,2} 我正在使用C#,我不需要使用UdpClient ,我只是在说明我的观点。

从UdpClient收到的UDP包中获取客户端IP

我正在System.Net.Sockets.UdpClient类的帮助下开发一个动作多人游戏。 它适用于两个玩家,因此应该打开服务器并等待传入​​的连接。 另一个玩家输入主机IP并尝试发送“ping”,以确保可以连接并且有一个打开的服务器。 主持人然后用“乒乓球”回应。 一旦游戏运行,两者都必须向对方发送udp消息,因此他们都需要对手的ip地址。 当然服务器也可以输入客户端IP,但这对我来说似乎是不必要的。 当收到“ping”消息时,如何从udp包中获取客户端IP? 这是我的接收代码(等待ping的服务器): private void ListenForPing() { while (!closeEverything) { var deserializer = new ASCIIEncoding(); IPEndPoint anyIP = new IPEndPoint(IPAddress.Any, 0); byte[] recData = udp.Receive(ref anyIP); string ping = deserializer.GetString(recData); if (ping == “ping”) { Console.WriteLine(“Ping received.”); InvokePingReceiveEvent(); } } }

有没有办法将对象强制转换回原始类型而不指定每个案例?

我有一个不同类型对象的数组,我使用BinaryWriter将每个项目转换为二进制等效项,以便我可以通过网络发送结构。 我现在做的事情 for ( i=0;i<tmpArrayList.Count;i++) { object x=tmpArrayList[i]; if (x.GetType() == typeof(byte)) { wrt.Write((byte)x); } …….. 问题是如果错过了一个类型,我的代码将来可能会破坏。 我想做点什么。 object x=tmpArrayList[i]; wrt.Write(x); 但除非我每次演员,否则它不起作用。 编辑: 在查阅答案之后,这就是我想出的function。 为了测试,该函数将数组发送到syslog。 private void TxMsg(ArrayList TxArray,IPAddress ipaddress) { Byte[] txbuf=new Byte[0]; int sz=0; // caculate size of txbuf foreach (Object o in TxArray) { if ( o is String ) { sz+=((String)(o)).Length; […]

在Send()之后的UdpClient,Receive()不起作用?

请考虑以下代码: client.Send(data, data.Length, endpoint); byte[] response = client.Receive(ref endpoint); 虽然根据WireShark(网络嗅探器),远程主机确实回复数据,但这里的应用程序只是永远等待数据……由于某种原因,它没有从远程主机接收答案。 有任何想法吗?