Программирование сокетов C#. Разрешить 2 приложениям использовать одно и то же соединение сокета/TCP

Я работаю над созданием приложения сокета С# и на стороне сервера. Мне нужно создать одну службу Windows C#, которая должна создать TCP-соединение и прослушивать/устанавливать соединение с клиентом на определенном адресе/порте. Скажем, пример: 172.00.000.0/1000, и я сделал это с помощью TCPListener.

И другая служба Windows С# будет использовать то же соединение сокета/TCP для передачи сообщения клиенту.

Этот дизайн предназначен для того, чтобы убедиться, что первая служба Windows будет удерживать соединение сокета/TCP все время, а вторая служба Windows может быть остановлена/приостановлена ​​при развертывании, и как только приложение запускается, соединение сокета начинает передавать сообщение, потому что , связь есть из-за 1-й службы Windows.


person Jayendran    schedule 05.02.2021    source источник
comment
Есть много лучших решений, чем сокеты. Предлагаю использовать signalr, GRPC, wcf, любую сервисную шину и в принципе любую другую современную технически кроме сокетов   -  person TheGeneral    schedule 05.02.2021
comment
*Технологии*...   -  person TheGeneral    schedule 05.02.2021
comment
Честно говоря, ваш дизайн вызывает сомнения. Но большая проблема в том, что вы не задали вопрос. С помощью собственного Win32 API можно скопировать дескриптор сокета и передать его дочернему процессу. Но у вас не может быть двух процессов, успешно использующих сокет одновременно. См., например. stackoverflow .com/questions/4604273/. Может быть, вы могли бы заставить это работать в вашей ситуации. Может быть нет. Ваш вопрос не имеет достаточной направленности, чтобы кто-либо мог дать хороший ответ.   -  person Peter Duniho    schedule 05.02.2021
comment
Почему бы просто не установить новое соединение в случае перезагрузки? - в любом случае приложение не может отправлять что-либо во время его закрытия, так зачем прикладывать усилия, чтобы сэкономить, возможно, долю секунды в этом сценарии?   -  person 500 - Internal Server Error    schedule 05.02.2021


Ответы (1)


вы можете попробовать использовать эту библиотеку TcpTransferLib: https://www.nuget.org/packages/TcpTransferLib /2.0.0.6

Это не документировано, но с помощью этой библиотеки легко создать сервер и клиент. Хорошо то, что эта библиотека заботится о чанках, поэтому вы можете просто отправлять сообщения на сервер или обратно клиенту. Я использую это в некоторых проектах, и он работает стабильно.

Код для сервера:

TcpTransfer tcpServer = null;
tcpServer = new TcpTransfer();
tcpServer.bufferChunk = 4096;
tcpServer.connectionTimeout = 15000;
tcpServer.receiveTimeout = 15000;
tcpServer.sendTimeout = 15000;
tcpServer.pingOnReceiveTimeout = true;
tcpServer.OnReceive += TcpServer_OnReceive;
tcpServer.StartServer(5557);

private void TcpServer_OnReceive(object sender, PacketReceiveEventArgs e)
{
      string data = Encoding.UTF8.GetString(e.data, 0, e.data.Length);
}

Код для клиента:

TcpTransfer tcpClient = null;
tcpClient = new TcpTransfer();
tcpClient.bufferChunk = 4096;
tcpClient.connectionTimeout = 15000;
tcpClient.receiveTimeout = 15000;
tcpClient.sendTimeout = 15000;
tcpClient.pingOnReceiveTimeout = true;

bool connected = tcpClient.Connect(ip, port);
if(connected)
  tcpClient.Send("hello", tcpClient.masterClient);

Это просто, но вариантов не так много :-)...

person nxexo007    schedule 16.02.2021
comment
Я попробую это. Спасибо. - person Jayendran; 28.02.2021