Как я могу слушать между сокетами TCP и stdinput в C# - PullRequest
0 голосов
/ 02 августа 2020

как я могу прослушивать TCP-сокеты и команду, полученную от STDIN на стороне сервера (например, «exit», чтобы закрыть все соединения и сервер).

Я помню, что в C мне просто нужно установить сокет STDIN, но как я могу создать сокет для STDIN и добавить этот сокет в массив.

Мне нужна такая функциональность, я прокомментировал часть выбора сокета STDIN для получения данных с клавиатуры.

using System;
using System.Collections;
using System.Net;
using System.Net.Sockets;
using System.Text;

public class SelectTcpSrvr
{
    public const int PORT = 9050;

    public static void Main()
    {
        ArrayList sockList = new ArrayList(2);
        ArrayList copyList = new ArrayList(2);
        Socket main = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        IPEndPoint iep = new IPEndPoint(IPAddress.Any, PORT);

        main.Bind(iep);
        main.Listen(2);
        sockList.Add(main);

        while (true)
        {
            copyList = new ArrayList(sockList);
            Console.WriteLine("Monitoring {0} sockets...", copyList.Count);
            Socket.Select(copyList, null, null, 1000000);

            foreach (Socket client in copyList)
            {
                if (client == main)
                {
                    Socket client1 = main.Accept();
                    IPEndPoint iep1 = (IPEndPoint)client1.RemoteEndPoint;
                    client1.Send(Encoding.ASCII.GetBytes("Welcome to the server"));
                    Console.WriteLine("Connected to {0}", iep1.ToString());
                    sockList.Add(client1);
                }

                //else if (I recive data from STDIN) {
                //    string command = data from SDTIN;
                //    switch (command)
                //    {
                //        // TODO
                //    }
                //}

                else
                {
                    byte[] data = new byte[1024];
                    int recv = client.Receive(data);
                    string stringData = Encoding.ASCII.GetString(data, 0, recv);
                    Console.WriteLine("Received: {0}", stringData);
                    if (recv == 0)
                    {
                        iep = (IPEndPoint)client.RemoteEndPoint;
                        Console.WriteLine("Client {0} disconnected.", iep.ToString());
                        client.Close();
                        sockList.Remove(client);
                        if (sockList.Count == 0)
                        {
                            Console.WriteLine("Last client disconnected, bye");
                            return;
                        }
                    }
                    else
                        client.Send(data, recv, SocketFlags.None);
                }
            }
        }
    }
}

1 Ответ

0 голосов
/ 02 августа 2020

long time a go Я разработал интерактивную программу CMD в c#, вы можете найти ее в по этой ссылке, по ссылке вы можете увидеть:

...
var process = new Process()
{
    StartInfo = new ProcessStartInfo()
    {
        FileName = "your process path.exe", //in code it was cmd.exe
        RedirectStandardOutput = true,
        RedirectStandardInput = true,
        RedirectStandardError = true,
        UseShellExecute = false,
        ErrorDialog = false,
        CreateNoWindow = true,
    }
};
process.Start();
var writer = process.StandardInput;
var reader = process.StandardOutput;
var error = process.StandardError;
...

by получив свой SocketStream, вы можете читать или писать в своем процессе, например:

using (var socketStream = new NetworkStream(main))
{
    //here is your read/write 
}
...