прослушиватель socat TCP с клиентом .NET

У меня есть прослушиватель socat TCP, работающий в Linux (SLES 12). Любой клиент, который подключается, передаст строку в сокет, а socat выполнит скрипт, который немного поработает на основе строки. Сценарий повторяет некоторые выходные данные, которые передаются обратно клиенту.

socat  TCP-LISTEN:9996,fork EXEC:/home/abhishek/hello.sh

Ниже приведен сценарий hello.sh.

#!/bin/bash
read str
echo "[Hello] $str" | tee -a test.txt

Когда я запускаю клиент ncat, это работает, как и ожидалось. ncat может вернуть данные и вывести их.

echo abhishek | ncat 192.168.1.12 9996
[Hello] abhishek

Теперь я хочу подключиться к socat через клиент .NET, написанный на C#. Ниже приведен необработанный код на основе сокетов, который я придумал.

IPAddress address = IPAddress.Parse("192.168.1.12");
IPEndPoint ipe = new IPEndPoint(address, 9996);

Socket client = new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

client.Connect(ipe);


byte[] msg = Encoding.ASCII.GetBytes("abhishek");

// Send the data through the socket.  
int bytesSent = client.Send(msg);
Console.WriteLine("Sent {0} bytes.", bytesSent);

byte[] bytes = new byte[128];
int bytesRec = client.Receive(bytes); ;
Console.WriteLine("Response text = {0}", Encoding.ASCII.GetString(bytes, 0, bytesRec));

client.Shutdown(SocketShutdown.Both);
client.Close();

Я получаю строку «Отправлено 8 байт», но после этого клиент зависает на Receive. Данные клиента принимаются hello.sh, поскольку файл test.txt содержит новую запись. Когда я убиваю клиента (Ctrl+C) socat печатает

2018/02/03 10:12:03 socat[21656] E write(4, 0xe530f0, 17): Broken pipe

Как мне прочитать ответ от socat на С#?

Спасибо


person Abhishek Kumar    schedule 03.02.2018    source источник


Ответы (1)


Я смог использовать TcpClient, чтобы установить связь с socat и получить вывод из скрипта. Ниже приведена основная часть кода, который я реализовал.

TcpClient client = new TcpClient("192.168.1.12", 9999);
NetworkStream stream = client.GetStream();

StreamWriter writer = new StreamWriter(stream) { AutoFlush = true };
StreamReader reader = new StreamReader(stream);

//Send message to socat.
writer.WriteLine(message);

//Receive reply from socat.
string reply = reader.ReadLine();

stream.close();
client.close();
person Abhishek Kumar    schedule 20.02.2018