У меня есть прослушиватель 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 на С#?
Спасибо