Netcode.IO 사양의 순수 관리형 C# 구현
이 프로젝트의 목표는 .NET 3.5에 대해 코딩된 Netcode.IO 사양의 순수 관리형 구현을 제공하고 최대 이식성을 위해 제로 네이티브 DLL 또는 래퍼를 사용하는 것입니다. 원래 C 참조 구현처럼 libsodium을 사용하는 대신 이 구현에서는 Bouncy Castle 암호화 라이브러리의 사용자 정의 버전을 사용합니다. 원본 소스 코드는 여기에서 찾을 수 있습니다: https://github.com/bcgit/bc-csharp
또한 게임용으로 설계되었습니다. 이를 위해 처음부터 GC 할당에 최소한의 영향을 미치도록 설계되었습니다. 대부분의 경우 Netcode.IO.NET 사용으로 인해 GC에 미치는 영향이 전혀 표시되지 않습니다.
대부분의 API는 NetcodeIO.NET
네임스페이스에 있습니다.
새 서버를 만들고 시작하려면:
Server server = new Server (
maxClients , // int maximum number of clients which can connect to this server at one time
publicAddress , port , // string public address and int port clients will connect to
protocolID , // ulong protocol ID shared between clients and server
privateKeyBytes // byte[32] private crypto key shared between backend servers
) ;
server . Start ( ) ; // start the server running
다양한 이벤트를 수신하려면:
// Called when a client has connected
server . OnClientConnected += clientConnectedHandler ; // void( RemoteClient client )
// Called when a client disconnects
server . OnClientDisconnected += clientDisconnectedHandler ; // void( RemoteClient client )
// Called when a payload has been received from a client
// Note that you should not keep a reference to the payload, as it will be returned to a pool after this call completes.
server . OnClientMessageRecieved += messageReceivedHandler ; // void( RemoteClient client, byte[] payload, int payloadSize )
// Called when the server logs a message
// If you are not using a custom logger, a handler using Console.Write() is sufficient.
server . OnLogMessage += logMessageHandler ; // void( string message, NetcodeLogLevel logLevel )
서버에 연결된 원격 클라이언트에 페이로드를 보내려면:
remoteClient . Send ( byte [ ] payload , int payloadSize ) ;
// or:
server . SendPayload ( RemoteClient client , byte [ ] payload , int payloadSize ) ;
클라이언트 연결을 끊으려면:
server . Disconnect ( RemoteClient client ) ;
연결 토큰으로 전달될 수 있는 임의의 256바이트 사용자 데이터를 얻으려면 다음을 수행하세요.
remoteClient . UserData ; // byte[256]
서버를 중지하고 클라이언트의 연결을 끊으려면 다음을 수행하십시오.
server . Stop ( ) ;
새 클라이언트를 생성하려면:
Client client = new Client ( ) ;
다양한 이벤트를 수신하려면:
// Called when the client's state has changed
// Use this to detect when a client has connected to a server, or has been disconnected from a server, or connection times out, etc.
client . OnStateChanged += clientStateChanged ; // void( ClientState state )
// Called when a payload has been received from the server
// Note that you should not keep a reference to the payload, as it will be returned to a pool after this call completes.
client . OnMessageReceived += messageReceivedHandler ; // void( byte[] payload, int payloadSize )
연결 토큰을 사용하여 서버에 연결하려면 다음 안내를 따르세요.
client . Connect ( connectToken ) ; // byte[2048] public connect token as returned by a TokenFactory
연결되었을 때 서버에 메시지를 보내려면:
client . Send ( byte [ ] payload , int payloadSize ) ;
클라이언트 연결을 끊으려면:
client . Disconnect ( ) ;
TokenFactory는 클라이언트가 게임 서버에 연결하는 데 사용하는 공개 연결 토큰을 생성하는 데 사용될 수 있습니다. 새로운 TokenFactory를 생성하려면:
TokenFactory tokenFactory = new TokenFactory (
protocolID , // must be the same protocol ID as passed to both client and server constructors
privateKey // byte[32], must be the same as the private key passed to the Server constructor
) ;
새로운 2048바이트 공개 연결 토큰을 생성하려면 다음 안내를 따르세요.
tokenFactory . GenerateConnectToken (
addressList , // IPEndPoint[] list of addresses the client can connect to. Must have at least one and no more than 32.
expirySeconds , // in how many seconds will the token expire
serverTimeout , // how long it takes until a connection attempt times out and the client tries the next server.
sequenceNumber , // ulong token sequence number used to uniquely identify a connect token.
clientID , // ulong ID used to uniquely identify this client
userData // byte[], up to 256 bytes of arbitrary user data (available to the server as RemoteClient.UserData)
) ;
Netcode.IO.NET은 Netcode.IO 프로토콜의 순수 포트입니다. 그 이상도 그 이하도 아닙니다. Netcode.IO의 핵심은 UDP 기반의 암호화 및 연결 기반 추상화입니다. 그리고 UDP와 마찬가지로 안정성이 전혀 보장되지 않습니다. 귀하의 메시지가 제대로 전달되지 않을 수도 있고 순서대로 전달되지 않을 수도 있습니다. 그것은 단지 인터넷의 사실입니다. 그렇긴 하지만, 모든 게임에는 일종의 신뢰성 계층이 거의 확실히 필요할 것입니다. 이를 위해 내 ReliableNetcode.NET 프로젝트는 이 기능을 게임에 추가하는 데 사용할 수 있는 불가지론적이고 사용하기 쉬운 안정성 레이어를 제공합니다.