Created
July 5, 2023 16:54
-
-
Save daramkun/85e462a06d5d60bed16324ba3afdc071 to your computer and use it in GitHub Desktop.
Ping with UDP
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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