diff --git a/src/SwiftTestingFrameworkAPI/Controllers/PrivatePortsController.cs b/src/SwiftTestingFrameworkAPI/Controllers/PrivatePortsController.cs index 5a4c87d..4954594 100644 --- a/src/SwiftTestingFrameworkAPI/Controllers/PrivatePortsController.cs +++ b/src/SwiftTestingFrameworkAPI/Controllers/PrivatePortsController.cs @@ -2,6 +2,9 @@ using Microsoft.AspNetCore.Mvc; using SwiftTestingFrameworkAPI.Utils; using System; +using System.Net.Sockets; +using System.Net; +using System.Text; namespace SwiftTestingFrameworkAPI.Controllers { @@ -38,21 +41,42 @@ public ObjectResult RequestSite() string stringAddr = Environment.GetEnvironmentVariable("WEBSITE_PRIVATE_IP") ?? string.Empty; string stringPort = Environment.GetEnvironmentVariable("WEBSITE_PRIVATE_PORTS") ?? string.Empty; + IPAddress hostIP = IPAddress.Parse(stringAddr); + IPEndPoint ep = new IPEndPoint(hostIP.Address, Int32.Parse(stringPort)); try { - p = Helper.StartProcess("tcpping.exe", stringAddr + ":" + stringPort); + using Socket client = new ( + ep.AddressFamily, + SocketType.Stream, + ProtocolType.Tcp + ); - if (p.ExitCode == 0) + client.Connect(ep); + while (true) { - testResponse = new TestResponse(Constants.ApiVersion, TestName, "Success", p.StdOutput, string.Empty); - return StatusCode(200, testResponse); - } - else - { - testResponse = new TestResponse(Constants.ApiVersion, TestName, "Failure", string.Empty, p.StdError); - return StatusCode(555, testResponse); + // Send message. + var message = "Hello world! <|EOM|>"; + var messageBytes = Encoding.UTF8.GetBytes(message); + client.Send(messageBytes, SocketFlags.None); + Console.WriteLine($"Socket client sent message: \"{message}\""); + + // Receive ack. + var buffer = new byte[1_024]; + var received = client.Receive(buffer, SocketFlags.None); + var response = Encoding.UTF8.GetString(buffer, 0, received); + if (response == "<|ACK|>") + { + Console.WriteLine( + $"Socket client received acknowledgment: \"{response}\""); + break; + } } + + client.Shutdown(SocketShutdown.Both); + + testResponse = new TestResponse(Constants.ApiVersion, TestName, "Success", "Message Sent", string.Empty); + return StatusCode(200, testResponse); } catch (Exception ex) { diff --git a/src/SwiftTestingFrameworkAPI/Lifetime.cs b/src/SwiftTestingFrameworkAPI/Lifetime.cs index 5d6c014..5150218 100644 --- a/src/SwiftTestingFrameworkAPI/Lifetime.cs +++ b/src/SwiftTestingFrameworkAPI/Lifetime.cs @@ -1,5 +1,6 @@ using System.Net.Sockets; using System.Net; +using System.Text; namespace SwiftTestingFrameworkAPI { @@ -23,7 +24,7 @@ public LifetimeService( public Task StartAsync(CancellationToken cancellationToken) { _logger.LogInformation("StartAsync has been called."); - + Task.Run(async () => { await ListenOnPrivatePort(); }); return Task.CompletedTask; } @@ -35,11 +36,27 @@ public Task StopAsync(CancellationToken cancellationToken) } private void OnStarted() + { + _logger.LogInformation("OnStarted has been called."); + } + + private void OnStopping() + { + _logger.LogInformation("OnStopping has been called."); + } + + private void OnStopped() + { + listenSocket.Close(); + _logger.LogInformation("OnStopped has been called."); + } + + public async Task ListenOnPrivatePort() { // Add services to the container. listenSocket = new Socket(AddressFamily.InterNetwork, - SocketType.Stream, - ProtocolType.Tcp); + SocketType.Stream, + ProtocolType.Tcp); // bind the listening socket to the port string stringAddr = Environment.GetEnvironmentVariable("WEBSITE_PRIVATE_IP") ?? string.Empty; @@ -50,18 +67,31 @@ private void OnStarted() // start listening listenSocket.Listen(); - _logger.LogInformation("OnStarted has been called."); - } - private void OnStopping() - { - _logger.LogInformation("OnStopping has been called."); - } + while (true) + { - private void OnStopped() - { - listenSocket.Close(); - _logger.LogInformation("OnStopped has been called."); + var handler = await listenSocket.AcceptAsync(); + // Receive message. + var buffer = new byte[1_024]; + var received = await handler.ReceiveAsync(buffer, SocketFlags.None); + var response = Encoding.UTF8.GetString(buffer, 0, received); + + var eom = "<|EOM|>"; + if (response.IndexOf(eom) > -1 /* is end of message */) + { + Console.WriteLine( + $"Socket server received message: \"{response.Replace(eom, "")}\""); + + var ackMessage = "<|ACK|>"; + var echoBytes = Encoding.UTF8.GetBytes(ackMessage); + await handler.SendAsync(echoBytes, 0); + Console.WriteLine( + $"Socket server sent acknowledgment: \"{ackMessage}\""); + + handler.Close(); + } + } } } }