@@ -11,8 +11,7 @@ public sealed class LobbyUdpClient : IDisposable
1111 readonly IPEndPoint serverEndpoint ;
1212 readonly UdpSocket socket ;
1313 readonly CancellationTokenSource cts = new ( ) ;
14- readonly byte [ ] buffer = GC . AllocateArray < byte > ( 36 , pinned : true ) ;
15-
14+ readonly byte [ ] sendBuffer = GC . AllocateArray < byte > ( Unsafe . SizeOf < Guid > ( ) , pinned : true ) ;
1615 readonly HashSet < Guid > knownClients = [ ] ;
1716 bool disposed ;
1817
@@ -27,45 +26,52 @@ public LobbyUdpClient(int localPort, Uri serverUrl, int serverPort)
2726
2827 public async Task HandShake ( User user , CancellationToken ct = default )
2928 {
30- if ( ! user . Token . TryFormat ( buffer , out var bytesWritten ) || bytesWritten is 0 ) return ;
31- await socket . SendToAsync ( buffer . AsMemory ( ) [ ..bytesWritten ] , serverEndpoint , ct ) ;
29+ if ( ! user . Token . TryWriteBytes ( sendBuffer , true , out var bytesWritten ) || bytesWritten is 0 )
30+ return ;
31+
32+ await socket . SendToAsync ( sendBuffer . AsMemory ( ) [ ..bytesWritten ] , serverEndpoint , ct ) ;
3233 }
3334
3435 public async Task Ping ( User user , Peer [ ] peers , CancellationToken ct = default )
3536 {
36- if ( peers . Length is 0 || ! user . PeerId . TryFormat ( buffer , out var bytesWritten ) ||
37+ if ( peers . Length is 0 || ! user . PeerId . TryWriteBytes ( sendBuffer , true , out var bytesWritten ) ||
3738 bytesWritten is 0 )
3839 return ;
3940
40- var msgBytes = buffer . AsMemory ( ) [ ..bytesWritten ] ;
41+ var msgBytes = sendBuffer . AsMemory ( ) [ ..bytesWritten ] ;
4142 for ( var i = 0 ; i < peers . Length ; i ++ )
4243 {
4344 var peer = peers [ i ] ;
4445 if ( peer . Connected && peer . PeerId != user . PeerId )
45- await socket . SendToAsync ( msgBytes , GetFallbackEndpoint ( user , peer ) , ct ) ;
46+ await socket . SendToAsync ( msgBytes , peer . GetEndpointForUser ( user ) , ct ) ;
4647 }
4748 }
4849
4950 [ AsyncMethodBuilder ( typeof ( PoolingAsyncValueTaskMethodBuilder ) ) ]
5051 async ValueTask Receive ( CancellationToken stoppingToken )
5152 {
52- var recBuffer = GC . AllocateArray < byte > ( 36 , pinned : true ) ;
53+ var idSize = Unsafe . SizeOf < Guid > ( ) ;
54+ var recBuffer = GC . AllocateArray < byte > ( idSize , pinned : true ) ;
5355 while ( ! stoppingToken . IsCancellationRequested )
5456 {
5557 try
5658 {
57- var receiveInfo = await socket . ReceiveAsync ( recBuffer , stoppingToken )
59+ var receiveInfo = await socket
60+ . ReceiveAsync ( recBuffer , stoppingToken )
5861 . ConfigureAwait ( false ) ;
5962
6063 if ( receiveInfo . ReceivedBytes is 0 ) continue ;
6164
62- var msg = Encoding . UTF8 . GetString ( recBuffer ) ;
63- Console . WriteLine ( $ "recv: { msg } from { receiveInfo . RemoteEndPoint } " ) ;
64-
65- if ( ! Guid . TryParse ( msg , out var peerToken ) )
65+ if ( receiveInfo . ReceivedBytes != idSize )
66+ {
67+ var msg = Encoding . UTF8 . GetString ( recBuffer . AsSpan ( 0 , receiveInfo . ReceivedBytes ) ) ;
68+ Console . WriteLine ( $ "recv ( { receiveInfo . RemoteEndPoint } ): ' { msg } '" ) ;
6669 continue ;
70+ }
6771
68- knownClients . Add ( peerToken ) ;
72+ Guid peerToken = new ( recBuffer . AsSpan ( 0 , receiveInfo . ReceivedBytes ) , true ) ;
73+ Console . WriteLine ( $ "recv ({ receiveInfo . RemoteEndPoint } ): Ping from '{ peerToken } '") ;
74+ if ( peerToken != Guid . Empty ) knownClients . Add ( peerToken ) ;
6975 }
7076 catch ( OperationCanceledException )
7177 {
@@ -78,15 +84,6 @@ async ValueTask Receive(CancellationToken stoppingToken)
7884 }
7985 }
8086
81- // Use local IP when over same network
82- public static IPEndPoint GetFallbackEndpoint ( User user , Peer peer )
83- {
84- if ( Equals ( peer . Endpoint . Address , user . IP ) && peer . LocalEndpoint is not null )
85- return peer . LocalEndpoint ;
86-
87- return peer . Endpoint ;
88- }
89-
9087 public bool IsKnown ( Guid id ) => knownClients . Contains ( id ) ;
9188
9289 public void Stop ( )
0 commit comments