как я могу прослушивать 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);
}
}
}
}
}