Skip to content

Instantly share code, notes, and snippets.

@daramkun
Created July 5, 2023 16:54
Show Gist options
  • Save daramkun/85e462a06d5d60bed16324ba3afdc071 to your computer and use it in GitHub Desktop.
Save daramkun/85e462a06d5d60bed16324ba3afdc071 to your computer and use it in GitHub Desktop.
Ping with UDP
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using Udping.Base;
var pingStructSizeOf = Marshal.SizeOf<PingStruct>();
var portStr = args.FirstOrDefault(arg => arg.StartsWith("--port=", StringComparison.OrdinalIgnoreCase)) ?? "--port=16789";
var port = short.Parse(portStr["--port=".Length..]);
var baseReceiveFrom = new IPEndPoint(IPAddress.Any, port);
using var udpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
udpSocket.Bind(baseReceiveFrom);
Span<byte> received = stackalloc byte[pingStructSizeOf * 16];
while (true)
{
EndPoint receiveFrom = baseReceiveFrom;
var receivedLength = udpSocket.ReceiveFrom(received, ref receiveFrom);
if (receivedLength == 0)
break;
udpSocket.SendTo(received.Slice(0, receivedLength), receiveFrom);
}
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using Udping.Base;
var pingStructSizeOf = Marshal.SizeOf<PingStruct>();
var addrStr = args.FirstOrDefault(arg => arg.StartsWith("--addr=", StringComparison.OrdinalIgnoreCase)) ?? "--addr=127.0.0.1";
var portStr = args.FirstOrDefault(arg => arg.StartsWith("--port=", StringComparison.OrdinalIgnoreCase)) ?? "--port=16789";
var addr = IPAddress.Parse(addrStr["--addr=".Length..]);
var port = short.Parse(portStr["--port=".Length..]);
var sendTo = new IPEndPoint(addr, port);
using var udpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
var id = 0L;
Span<byte> receiveBuffer = stackalloc byte[pingStructSizeOf * 16];
while (true)
{
var pingStruct = new PingStruct(++id, DateTime.Now.TimeOfDay);
var sendBuffer = MemoryMarshal.Cast<PingStruct, byte>(MemoryMarshal.CreateSpan(ref pingStruct, 1));
udpSocket.SendTo(sendBuffer, sendTo);
EndPoint receiveFrom = sendTo;
var totalReceived = udpSocket.ReceiveFrom(receiveBuffer, ref receiveFrom);
var receiveds = MemoryMarshal.Cast<byte, PingStruct>(receiveBuffer);
var receivedsLength = totalReceived / pingStructSizeOf;
var currentTime = DateTime.Now.TimeOfDay;
for (var i = 0; i < receivedsLength; ++i)
{
var received = receiveds[i];
Console.WriteLine("[{0}] {1}ms", received.Id, (currentTime - received.StartTime).TotalMilliseconds);
}
Thread.Sleep(1000);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment