Tag: udp

套接字:有时(很少)数据包在接收期间丢失

我正在使用Socket从udp多播接收数据。 代码很简单: s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); …. while (true) { int count = 0; try { count = socket.Receive(byteArray); } catch (Exception e) { Console.WriteLine(e.Message); return; } if (count > 0) { OnNewMessage(new NewMessageEventArgs(byteArray, count)); } } 问题是我有时会丢失数据包。 不常见,〜每2分钟一次。 我确信数据包已到达,因为我可以在同一台计算机上启动的另一个C ++程序中看到它并配置为接收相同的数据包。 为什么我的程序无法捕获其他人可以的数据包? 为什么我丢包? 计算机是否可能太慢(或太忙)无法接收数据包? 我每秒收到大约2 000个数据包并使用Xeon E3处理器,我认为应该更多……

C#UDP数据包丢失但所有数据包都到达(WireShark)

正如标题所说我在C#中遇到UDP问题。 我正在尝试为DayZ游戏的rcon协议构建一个库。 我的问题是我没有收到我应该收到的每一个数据包。 发送命令后,服务器回复分裂答案。 包头包含总包数和当前包的索引。 现在,如果我应该获得17个数据包,我的应用程序中只能获得8-15个数据包。 在使用WireShark进行测试后,我现在知道所有包都到达了我的计算机。 他们只是不被我的应用程序或类似的东西认可。 我的实际问题是:是否可以防止丢失我的网卡和我的应用程序之间的包裹? 或者为什么会这样? 这是我目前的代码。 它非常脏,因为我在按预期工作后撕开它: private Socket _udpClient; private Thread _receiverThread; private Thread _workerThread; private Queue _packetQueue; private PacketBuffer[] MessageBuffer; private byte SenderSequence = 0; private IPEndPoint connection; public RCon(IPAddress ip, int port) { connection = new IPEndPoint(ip, port); _udpClient = new Socket(connection.Address.AddressFamily, SocketType.Dgram, ProtocolType.Udp); _udpClient.Connect(connection); MessageBuffer = […]

c#中的UDP客户端速率控制

我连续发送多个udp数据包到远程PC。 问题是,如果数据量太高,某些设备之间的某个通道会遇到缓冲区溢出。 我打算限制/限制/控制udp数据包的发送速率。 谁能给我一些关于如何找到最佳费率发送间隔的指导? 顺便说一句,请停止建议tcp over udp。 目标不是可靠地发送数据,而是测量最大吞吐量。

WAN上的TCP / UDP套接字服务器

我在c#中编写了一个socket服务器,它将用作我所参与的小型游戏项目的基本设计。 套接字服务器在lan上运行良好。 我能够在服务器和客户端之间完全通信。 但是,在WAN上,服务器从客户端接收所有正确的消息,但客户端不从服务器接收消息。 客户端和服务器都在路由器后面,但只有服务器的路由器有端口转发。 当客户端连接到服务器时,我获得连接的IP地址。 由于客户端位于NAT后面,是否需要收集发件人的更多信息? 我假设客户端可以设置端口转发,但这对游戏来说非常适得其反。 我能得到的任何帮助表示赞赏。 如果您需要代码,请告诉我。 提前致谢。 用于从客户端建立TCP连接 public string ConnectionAttempt(string ServeIP, string PlayUsername) { username = PlayUsername; try { connectionClient = new TcpClient(ServeIP,TCP_PORT_NUMBER); connectionClient.GetStream().BeginRead(readbuffer, 0, READ_BUFFER_SIZE, new AsyncCallback(DoRead), null); Login(username); ipAddress = IPAddress.Parse(((IPEndPoint)connectionClient.Client.RemoteEndPoint).Address.ToString()); servIP = new IPEndPoint(ipAddress,65002); listenUDP = new IPEndPoint(ipAddress, 0); UDPListenerThread = new Thread(receiveUDP); UDPListenerThread.IsBackground = true; UDPListenerThread.Start(); […]

当服务器和客户端在同一台计算机上时,收听广播

在晚上度过了更好的一部分后,我无法使其发挥作用。 这是我正在做的事情: 这是一个由一个参与者托管并由其他玩家加入的网络游戏。 主持人自己也是一名球员。 用户单击“主机”按钮开始在UDP上做广告。 其他用户可以看到所有可用主机的列表,并选择一个加入。 作为入门者,我下载了NetworkHelper库来研究UWP中的网络工作方式。 该库提供了我分别用于Host和Player类的UDPManager和UDPParticipant类。 该库还包括一个小问答游戏样本。 我的架构和游戏之间唯一的重大变化是我的一个玩家需要充当主机和玩家,而示例游戏可以一次充当主机或玩家。 因此,与它们不同,我需要同时监听两个DatagramSocket对象。 一切正常,除了(grrr ……为什么除了总是在拐角处),主机上运行的客户端无法收听广告消息。 DatagramSocket告诉我,对于相同的网络地址(协议/主机/端口),我不能有多个用法。 如果我为服务器和客户端使用不同的端口(下面是AdvertiserPort和ListenerPort ),则没有exception,但客户端从不接收广告消息。 这是服务器(仅包括相关代码): AdvertiserSocket = new DatagramSocket(); AdvertiserSocket.MessageReceived += MessageToConnectReceivedFromParticipantAsync; await AdvertiserSocket.BindServiceNameAsync(AdvertiserPort); _timer = new Timer(async state => await SendMessageAsync(), null, 0, AdvertiserInterval); 和广告: private async Task SendMessageAsync() { Stream outStream = (await AdvertiserSocket.GetOutputStreamAsync(AdvertiserGroupHost, AdvertiserPort)).AsStreamForWrite(); using (var writer = new StreamWriter(outStream)) […]

如何使用C#UdpClient发送大数据?

我正在尝试使用C#UdpClient发送大量数据(超过50 MB)。 因此,首先我将数据拆分为65507字节块并将其发送到循环中。 for(int i = 0; i < packetCount; i++) myUdpClient.Send(blocks[i], block[i].Length, remoteEndPoint); 我的问题是只能收到第一个数据包。 在发送第一个数据包期间,网络负载迅速增加到100%,然后无法接收其他数据包。 我希望获得尽可能多的数据吞吐量。 对不起我的英语! 感谢您的帮助。

UDP端口打开检查

在同一台计算机上检查UDP端口是否打开的最佳方法是什么。 我有端口号7525UDP ,如果它打开我想绑定它。 我正在使用此代码: while (true) { try {socket.bind()} catch (Exception ex) {MessageBox.Show(“socket probably in use”);} } 但是是否有指定的function可以检查UDP端口是否打开。 如果没有扫描UDP端口的整个表集也会很好。

在Windows Phone 7中异步接收UDP单播数据包的问题

我正在尝试让我的Windows Phone 7 Mango应用程序收听传入的UDP数据包,但有一点时间。 我安装了Windows Phone 7.1 SDK和开发工具的新Beta 2更新。 我从这个MSDN示例尝试的任何偏差都会导致SocketException 10022,“提供了无效的参数”。 我的代码粘贴在下面。 我一直在尝试调整我在这个stackoverflowpost上找到的代码,但无济于事。 此行在达到时生成exception: synchronous = m_udpSock.ReceiveFromAsync(udpRecvArg); 我希望这里有人可以帮助确定出现了什么问题。 当用户按下按钮时,我正在调用“StartUnicastListen()”。 m_udpSock以前被定义为类变量并设置为null。 根据ReceiveFromAsync()MSDN页面的“备注”部分,我设置了所有必需的属性和事件。 private void StartUnicastListen() { m_udpSock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); SocketAsyncEventArgs udpRecvArg = new SocketAsyncEventArgs(); udpRecvLoopStart(udpRecvArg); } private void udpRecvLoopStart(SocketAsyncEventArgs udpRecvArg) { byte[] udpRecvBuffer = new byte[2048]; udpRecvArg.SetBuffer(udpRecvBuffer, 0, udpRecvBuffer.Length); udpRecvArg.RemoteEndPoint = new IPEndPoint(IPAddress.Any, […]

发送和接收UDP数据包

以下代码在端口15000上发送数据包: int port = 15000; UdpClient udp = new UdpClient(); //udp.EnableBroadcast = true; //This was suggested in a now deleted answer IPEndPoint groupEP = new IPEndPoint(IPAddress.Broadcast, port); string str4 = “I want to receive this!”; byte[] sendBytes4 = Encoding.ASCII.GetBytes(str4); udp.Send(sendBytes4, sendBytes4.Length, groupEP); udp.Close(); 但是,如果我不能在另一台计算机上接收它,它就没用了。 我所需要的只是将命令发送到局域网上的另一台计算机,并让它接收它并做一些事情。 不使用Pcap库,有什么办法可以实现这个目标吗? 我的程序正在与之通信的计算机是Windows XP 32位,而发送计算机是Windows 7 64位,如果它有所作为。 我已经研究了各种net send命令,但我无法弄明白。 我也可以访问计算机(XP one)的本地IP,因为它可以在其上物理输入’ipconfig’。 […]

远程主机强制关闭现有连接

我需要从异步套接字服务器获取UDP数据报,但我的应用程序中发生exception: 出现问题: Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint); 完整源代码: class Program { static void Main(string[] args) { const int PORT = 30485; IPAddress IP; IPAddress.TryParse(“92.56.23.87”, out IP); // This constructor arbitrarily assigns the local port number. UdpClient udpClient = new UdpClient(PORT); Socket receiveSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); try { udpClient.Connect(“92.56.23.87”, PORT); if (udpClient.Client.Connected) Console.WriteLine(“Connected.”); // […]