Dreamine.PLC.Omron.Fins 1.0.1
Dreamine.PLC.Omron.Fins 산업 자동화 및 I/O 기능을 제공합니다.
로딩중...
검색중...
일치하는것 없음
Dreamine.PLC.Omron.Fins.Simulation.OmronFinsTcpSimulatorServer 클래스 참조sealed

더 자세히 ...

Dreamine.PLC.Omron.Fins.Simulation.OmronFinsTcpSimulatorServer에 대한 상속 다이어그램 :
Dreamine.PLC.Omron.Fins.Simulation.OmronFinsTcpSimulatorServer에 대한 협력 다이어그램:

Public 멤버 함수

 OmronFinsTcpSimulatorServer (OmronFinsSimulatorServerOptions options)
 OmronFinsTcpSimulatorServer (OmronFinsSimulatorServerOptions options, InMemoryPlcMemory memory)
Task StartAsync ()
async Task StopAsync ()
async ValueTask DisposeAsync ()

속성

bool IsRunning [get]

이벤트

EventHandler< string >? StatusChanged

Private 멤버 함수

async Task AcceptLoopAsync (CancellationToken cancellationToken)
async Task ClientLoopAsync (TcpClient client, CancellationToken cancellationToken)

정적 Private 멤버 함수

static IPAddress ParseAddress (string host)
static async Task< byte[]> ReceiveFinsTcpPacketAsync (NetworkStream stream, CancellationToken cancellationToken)
static async Task ReadExactlyAsync (NetworkStream stream, byte[] buffer, CancellationToken cancellationToken)

Private 속성

readonly OmronFinsSimulatorServerOptions _options
readonly InMemoryPlcMemory _memory
readonly OmronFinsSimulatorProtocol _protocol
readonly List< TcpClient > _clients = []
readonly object _syncRoot = new()
TcpListener? _listener
CancellationTokenSource? _cts
Task? _acceptTask

상세한 설명

로컬 및 PC 간 테스트를 위한 최소 FINS/TCP 시뮬레이터 서버를 제공합니다.

OmronFinsTcpSimulatorServer.cs 파일의 16 번째 라인에서 정의되었습니다.

생성자 & 소멸자 문서화

◆ OmronFinsTcpSimulatorServer() [1/2]

Dreamine.PLC.Omron.Fins.Simulation.OmronFinsTcpSimulatorServer.OmronFinsTcpSimulatorServer ( OmronFinsSimulatorServerOptions options)
inline

새 메모리를 사용해 T:Dreamine.PLC.Omron.Fins.Simulation.OmronFinsTcpSimulatorServer 클래스의 새 인스턴스를 초기화합니다.

매개변수
options바인딩 및 자동 응답 서버 옵션입니다.
예외
ArgumentNullExceptionoptionsnull일 때 발생합니다.

OmronFinsTcpSimulatorServer.cs 파일의 115 번째 라인에서 정의되었습니다.

116 : this(options, new InMemoryPlcMemory())
117 {
118 }

◆ OmronFinsTcpSimulatorServer() [2/2]

Dreamine.PLC.Omron.Fins.Simulation.OmronFinsTcpSimulatorServer.OmronFinsTcpSimulatorServer ( OmronFinsSimulatorServerOptions options,
InMemoryPlcMemory memory )
inline

지정한 공유 메모리를 사용해 T:Dreamine.PLC.Omron.Fins.Simulation.OmronFinsTcpSimulatorServer 클래스의 새 인스턴스를 초기화합니다.

매개변수
options바인딩 및 자동 응답 서버 옵션입니다.
memory요청 간에 공유할 PLC 메모리입니다.
예외
ArgumentNullExceptionoptions 또는 memorynull일 때 발생합니다.

OmronFinsTcpSimulatorServer.cs 파일의 152 번째 라인에서 정의되었습니다.

153 {
154 _options = options ?? throw new ArgumentNullException(nameof(options));
155 _memory = memory ?? throw new ArgumentNullException(nameof(memory));
156 _protocol = new OmronFinsSimulatorProtocol(_memory, _options);
157 _protocol.StatusChanged += (_, message) => StatusChanged?.Invoke(this, message);
158 }

다음을 참조함 : _memory, _options, _protocol, StatusChanged.

멤버 함수 문서화

◆ AcceptLoopAsync()

async Task Dreamine.PLC.Omron.Fins.Simulation.OmronFinsTcpSimulatorServer.AcceptLoopAsync ( CancellationToken cancellationToken)
inlineprivate

TCP 클라이언트 연결을 수락하고 각각의 처리 루프를 백그라운드에서 시작합니다.

매개변수
cancellationToken연결 수락을 중지하는 토큰입니다.
반환값
수락 루프 수명 동안 실행되는 작업입니다.
예외
SocketException취소 이외의 이유로 클라이언트 수락이 실패할 때 발생할 수 있습니다.

OmronFinsTcpSimulatorServer.cs 파일의 379 번째 라인에서 정의되었습니다.

380 {
381 while (!cancellationToken.IsCancellationRequested && _listener is not null)
382 {
383 TcpClient client;
384
385 try
386 {
387 client = await _listener.AcceptTcpClientAsync(cancellationToken).ConfigureAwait(false);
388 }
389 catch (OperationCanceledException)
390 {
391 break;
392 }
393 catch (ObjectDisposedException)
394 {
395 break;
396 }
397 catch (SocketException) when (cancellationToken.IsCancellationRequested)
398 {
399 break;
400 }
401
402 lock (_syncRoot)
403 {
404 _clients.Add(client);
405 }
406
407 _ = Task.Run(() => ClientLoopAsync(client, cancellationToken), cancellationToken);
408 }
409 }

다음을 참조함 : _clients, _listener, _syncRoot, ClientLoopAsync().

다음에 의해서 참조됨 : StartAsync().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ ClientLoopAsync()

async Task Dreamine.PLC.Omron.Fins.Simulation.OmronFinsTcpSimulatorServer.ClientLoopAsync ( TcpClient client,
CancellationToken cancellationToken )
inlineprivate

단일 TCP 클라이언트의 FINS/TCP 요청을 수신·처리·응답합니다.

매개변수
client처리할 연결된 TCP 클라이언트입니다.
cancellationToken클라이언트 루프를 중지하는 토큰입니다.
반환값
클라이언트 연결 수명 동안 실행되는 작업입니다.

OmronFinsTcpSimulatorServer.cs 파일의 443 번째 라인에서 정의되었습니다.

444 {
445 try
446 {
447 using (client)
448 {
449 var stream = client.GetStream();
450 while (!cancellationToken.IsCancellationRequested && client.Connected)
451 {
452 var packet = await ReceiveFinsTcpPacketAsync(stream, cancellationToken).ConfigureAwait(false);
453 var request = OmronFinsTcpPacket.Extract(packet);
454 var response = _protocol.HandleRequest(request);
455 var responsePacket = OmronFinsTcpPacket.Wrap(response);
456 await stream.WriteAsync(responsePacket, cancellationToken).ConfigureAwait(false);
457 await stream.FlushAsync(cancellationToken).ConfigureAwait(false);
458 }
459 }
460 }
461 catch (OperationCanceledException)
462 {
463 }
464 catch (IOException)
465 {
466 }
467 catch (SocketException)
468 {
469 }
470 catch (ObjectDisposedException)
471 {
472 }
473 catch (Exception ex)
474 {
475 StatusChanged?.Invoke(this, $"FINS TCP client error: {ex.Message}");
476 }
477 finally
478 {
479 lock (_syncRoot)
480 {
481 _clients.Remove(client);
482 }
483 }
484 }

다음을 참조함 : _clients, _protocol, _syncRoot, Dreamine.PLC.Omron.Fins.Protocol.OmronFinsTcpPacket.Extract(), ReceiveFinsTcpPacketAsync(), StatusChanged, Dreamine.PLC.Omron.Fins.Protocol.OmronFinsTcpPacket.Wrap().

다음에 의해서 참조됨 : AcceptLoopAsync().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ DisposeAsync()

async ValueTask Dreamine.PLC.Omron.Fins.Simulation.OmronFinsTcpSimulatorServer.DisposeAsync ( )
inline

서버를 중지해 비동기로 정리합니다.

반환값
비동기 정리 작업을 나타내는 값 작업입니다.

OmronFinsTcpSimulatorServer.cs 파일의 307 번째 라인에서 정의되었습니다.

308 {
309 await StopAsync().ConfigureAwait(false);
310 }

다음을 참조함 : StopAsync().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ ParseAddress()

IPAddress Dreamine.PLC.Omron.Fins.Simulation.OmronFinsTcpSimulatorServer.ParseAddress ( string host)
inlinestaticprivate

구성된 바인딩 호스트를 IP 주소로 변환하며 와일드카드와 잘못된 값은 모든 인터페이스로 처리합니다.

매개변수
host변환할 호스트 또는 와일드카드 문자열입니다.
반환값
구문 분석된 주소 또는 IPAddress.Any입니다.

OmronFinsTcpSimulatorServer.cs 파일의 337 번째 라인에서 정의되었습니다.

338 {
339 if (string.IsNullOrWhiteSpace(host) || host == "0.0.0.0" || host == "*" || host == "+")
340 {
341 return IPAddress.Any;
342 }
343
344 return IPAddress.TryParse(host, out var address) ? address : IPAddress.Any;
345 }

다음에 의해서 참조됨 : StartAsync().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ ReadExactlyAsync()

async Task Dreamine.PLC.Omron.Fins.Simulation.OmronFinsTcpSimulatorServer.ReadExactlyAsync ( NetworkStream stream,
byte[] buffer,
CancellationToken cancellationToken )
inlinestaticprivate

네트워크 스트림에서 대상 버퍼를 끝까지 채웁니다.

매개변수
stream읽을 네트워크 스트림입니다.
buffer완전히 채울 대상 버퍼입니다.
cancellationToken읽기를 취소하는 토큰입니다.
반환값
비동기 읽기 작업입니다.
예외
IOException버퍼를 채우기 전에 클라이언트가 연결을 닫으면 발생합니다.
OperationCanceledException읽기가 취소되면 발생합니다.

OmronFinsTcpSimulatorServer.cs 파일의 616 번째 라인에서 정의되었습니다.

617 {
618 var offset = 0;
619 while (offset < buffer.Length)
620 {
621 var read = await stream.ReadAsync(buffer.AsMemory(offset, buffer.Length - offset), cancellationToken).ConfigureAwait(false);
622 if (read == 0)
623 {
624 throw new IOException("The FINS TCP client closed the connection.");
625 }
626
627 offset += read;
628 }
629 }

다음에 의해서 참조됨 : ReceiveFinsTcpPacketAsync().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ ReceiveFinsTcpPacketAsync()

async Task< byte[]> Dreamine.PLC.Omron.Fins.Simulation.OmronFinsTcpSimulatorServer.ReceiveFinsTcpPacketAsync ( NetworkStream stream,
CancellationToken cancellationToken )
inlinestaticprivate

FINS/TCP 헤더와 선언된 본문 길이를 기준으로 패킷 하나를 정확히 수신합니다.

매개변수
stream읽을 클라이언트 네트워크 스트림입니다.
cancellationToken수신을 취소하는 토큰입니다.
반환값
헤더와 본문을 포함한 완전한 FINS/TCP 패킷입니다.
예외
InvalidOperationException헤더의 패킷 길이가 8보다 작을 때 발생합니다.
IOException완전한 패킷을 받기 전에 클라이언트가 연결을 닫으면 발생합니다.
OperationCanceledException수신이 취소되면 발생합니다.

OmronFinsTcpSimulatorServer.cs 파일의 542 번째 라인에서 정의되었습니다.

543 {
544 var header = new byte[16];
545 await ReadExactlyAsync(stream, header, cancellationToken).ConfigureAwait(false);
546 var length = OmronFinsEndian.ReadInt32(header, 4);
547 if (length < 8)
548 {
549 throw new InvalidOperationException($"Invalid FINS/TCP packet length: {length}.");
550 }
551
552 var body = new byte[length - 8];
553 await ReadExactlyAsync(stream, body, cancellationToken).ConfigureAwait(false);
554 var packet = new byte[header.Length + body.Length];
555 Buffer.BlockCopy(header, 0, packet, 0, header.Length);
556 Buffer.BlockCopy(body, 0, packet, header.Length, body.Length);
557 return packet;
558 }

다음을 참조함 : ReadExactlyAsync(), Dreamine.PLC.Omron.Fins.Protocol.OmronFinsEndian.ReadInt32().

다음에 의해서 참조됨 : ClientLoopAsync().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ StartAsync()

Task Dreamine.PLC.Omron.Fins.Simulation.OmronFinsTcpSimulatorServer.StartAsync ( )
inline

구성된 주소와 포트에서 TCP 수신을 시작하고 연결 수락 루프를 실행합니다.

반환값
서버가 이미 실행 중이거나 시작이 완료되면 완료되는 작업입니다.
예외
SocketException주소 또는 포트에서 수신을 시작할 수 없을 때 발생할 수 있습니다.
ArgumentOutOfRangeException구성된 포트가 유효한 범위를 벗어날 때 발생할 수 있습니다.

OmronFinsTcpSimulatorServer.cs 파일의 212 번째 라인에서 정의되었습니다.

213 {
214 if (IsRunning)
215 {
216 return Task.CompletedTask;
217 }
218
219 var address = ParseAddress(_options.Host);
220
221 _cts = new CancellationTokenSource();
222 _listener = new TcpListener(address, _options.Port);
223 _listener.Start();
224 _acceptTask = AcceptLoopAsync(_cts.Token);
225 StatusChanged?.Invoke(this, $"FINS TCP simulator listening on {_options.Host}:{_options.Port}.");
226 return Task.CompletedTask;
227 }

다음을 참조함 : _acceptTask, _cts, _listener, _options, AcceptLoopAsync(), IsRunning, ParseAddress(), StatusChanged.

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ StopAsync()

async Task Dreamine.PLC.Omron.Fins.Simulation.OmronFinsTcpSimulatorServer.StopAsync ( )
inline

TCP 수신기와 모든 클라이언트를 닫고 수락 루프를 종료합니다.

반환값
연결과 수락 루프의 종료 및 자원 정리를 나타내는 작업입니다.

OmronFinsTcpSimulatorServer.cs 파일의 245 번째 라인에서 정의되었습니다.

246 {
247 if (!IsRunning)
248 {
249 return;
250 }
251
252 _cts?.Cancel();
253 _listener?.Stop();
254 _listener = null;
255
256 TcpClient[] clients;
257 lock (_syncRoot)
258 {
259 clients = _clients.ToArray();
260 _clients.Clear();
261 }
262
263 foreach (var client in clients)
264 {
265 client.Dispose();
266 }
267
268 if (_acceptTask is not null)
269 {
270 try
271 {
272 await _acceptTask.ConfigureAwait(false);
273 }
274 catch (OperationCanceledException)
275 {
276 }
277 catch (ObjectDisposedException)
278 {
279 }
280 catch (SocketException)
281 {
282 }
283 }
284
285 _cts?.Dispose();
286 _cts = null;
287 _acceptTask = null;
288 StatusChanged?.Invoke(this, "FINS TCP simulator stopped.");
289 }

다음을 참조함 : _acceptTask, _clients, _cts, _listener, _syncRoot, IsRunning, StatusChanged.

다음에 의해서 참조됨 : DisposeAsync().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

멤버 데이터 문서화

◆ _acceptTask

Task? Dreamine.PLC.Omron.Fins.Simulation.OmronFinsTcpSimulatorServer._acceptTask
private

accept Task 값을 보관합니다.

OmronFinsTcpSimulatorServer.cs 파일의 89 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : StartAsync(), StopAsync().

◆ _clients

readonly List<TcpClient> Dreamine.PLC.Omron.Fins.Simulation.OmronFinsTcpSimulatorServer._clients = []
private

clients 값을 보관합니다.

OmronFinsTcpSimulatorServer.cs 파일의 53 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : AcceptLoopAsync(), ClientLoopAsync(), StopAsync().

◆ _cts

CancellationTokenSource? Dreamine.PLC.Omron.Fins.Simulation.OmronFinsTcpSimulatorServer._cts
private

cts 값을 보관합니다.

OmronFinsTcpSimulatorServer.cs 파일의 80 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : StartAsync(), StopAsync().

◆ _listener

TcpListener? Dreamine.PLC.Omron.Fins.Simulation.OmronFinsTcpSimulatorServer._listener
private

listener 값을 보관합니다.

OmronFinsTcpSimulatorServer.cs 파일의 71 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : AcceptLoopAsync(), StartAsync(), StopAsync().

◆ _memory

readonly InMemoryPlcMemory Dreamine.PLC.Omron.Fins.Simulation.OmronFinsTcpSimulatorServer._memory
private

memory 값을 보관합니다.

OmronFinsTcpSimulatorServer.cs 파일의 35 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : OmronFinsTcpSimulatorServer().

◆ _options

readonly OmronFinsSimulatorServerOptions Dreamine.PLC.Omron.Fins.Simulation.OmronFinsTcpSimulatorServer._options
private

options 값을 보관합니다.

OmronFinsTcpSimulatorServer.cs 파일의 26 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : OmronFinsTcpSimulatorServer(), StartAsync().

◆ _protocol

readonly OmronFinsSimulatorProtocol Dreamine.PLC.Omron.Fins.Simulation.OmronFinsTcpSimulatorServer._protocol
private

protocol 값을 보관합니다.

OmronFinsTcpSimulatorServer.cs 파일의 44 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : ClientLoopAsync(), OmronFinsTcpSimulatorServer().

◆ _syncRoot

readonly object Dreamine.PLC.Omron.Fins.Simulation.OmronFinsTcpSimulatorServer._syncRoot = new()
private

sync Root 값을 보관합니다.

OmronFinsTcpSimulatorServer.cs 파일의 62 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : AcceptLoopAsync(), ClientLoopAsync(), StopAsync().

속성 문서화

◆ IsRunning

bool Dreamine.PLC.Omron.Fins.Simulation.OmronFinsTcpSimulatorServer.IsRunning
get

TCP 수신기가 생성되어 서버가 실행 중인지 여부를 가져옵니다.

OmronFinsTcpSimulatorServer.cs 파일의 178 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : StartAsync(), StopAsync().

이벤트 문서화

◆ StatusChanged

EventHandler<string>? Dreamine.PLC.Omron.Fins.Simulation.OmronFinsTcpSimulatorServer.StatusChanged

서버 상태 또는 프로토콜 상태가 변경될 때 발생합니다.

OmronFinsTcpSimulatorServer.cs 파일의 168 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : ClientLoopAsync(), OmronFinsTcpSimulatorServer(), StartAsync(), StopAsync().


이 클래스에 대한 문서화 페이지는 다음의 파일로부터 생성되었습니다.: