Конфигурация устройства таймера проста и выполняется через панель. На этой панели я указываю IP-адрес хоста, порт связи, режим связи и режим работы таймера (клиент или сервер). В моем случае я настроил таймер для работы в качестве клиента, поэтому он периодически пытается связаться с хостом через настроенный порт.
Когда я запускаю службу локально, все работает отлично. Однако при развертывании его в производственной среде или настройке сети связь прерывается. Я уже открыл необходимые правила брандмауэра для входящего и исходящего трафика на порту 3000, но все еще не могу заставить его работать.
Буду признателен за любую помощь в определении того, что может отсутствовать или любые дополнительные конфигурации, которые мне следует проверить. Заранее спасибо!
В коде я использую TcpListener, настроенный на прослушивание соединений через порт 3000. Я также реализовал файл журнала для записи событий связи. При локальном тестировании с использованием PowerShell с помощью команды:
Test-NetConnection -ComputerName 191...175 -Port 3000
или с помощью Telnet связь работает как положено, и в журнале события фиксируются правильно.
Здесь блокируем код
Для создания программы:
1-й шаг: откройте визуализацию Studio
2-й шаг: выберите шаблон Worker Service
3-й шаг: замените код класса Worker.cs на:
Код: Выделить всё
using System.Net.Sockets;
using System.Net;
namespace service
{
public class Worker : BackgroundService
{
private readonly ILogger _logger;
public Worker(ILogger logger)
{
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
TcpListener listener = new(IPAddress.Any, 3000);
listener.Start();
string path = @"C:\LogsService";
string filePath = Path.Combine(path, "log.txt");
if (!Directory.Exists(path))
Directory.CreateDirectory(path);
using (var fileStream = new FileStream(filePath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
{
using (var write = new StreamWriter(fileStream))
{
await write.WriteLineAsync($"Worker running");
}
}
while (!stoppingToken.IsCancellationRequested)
{
var client = await listener.AcceptTcpClientAsync();
try
{
using (var fileStream = new FileStream(filePath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
{
using(var write = new StreamWriter(fileStream))
{
await write.WriteLineAsync($"Worker running at:{client.Client.RemoteEndPoint?.ToString()}");
}
}
}
catch (Exception)
{
throw;
}
}
try
{
using (var fileStream = new FileStream(Path.Combine(path, "exit.txt"), FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
{
using (var write = new StreamWriter(fileStream))
{
await write.WriteLineAsync($"Exit: {stoppingToken.IsCancellationRequested.ToString()}");
}
}
}
catch (Exception)
{
throw;
}
}
}
}

Подробнее здесь: https://stackoverflow.com/questions/793 ... -server-on