Я настраиваю сервер, используя c #, он имеет бесконечный цикл, содержащий Socket.ReceiveFrom, поэтому приложение всегда будет бездействующим, пока не получено сообщение, проблема в том, что я прочитал на веб-сайте: «Когда приложение завершеноДля связи по сокету необходимо закрыть соединение, чтобы освободить ресурс ", значит ли это, что при каждом получении сообщения о закрытии сокета?
это означает, что мне нужно повторно инициализировать конструкторсокета каждый раз, когда цикл повторяется сам, поэтому я искал: «автоматически ли сокеты закрываются, когда приложение завершается», но не нашел ответа на этот вопрос.
следующие два кодапоясню:
static void Main(string[] args)
{
// With out closing
byte[] data = new byte[1024];
IPEndPoint endpoint = new IPEndPoint(IPAddress.Any, 8888);
Socket sckt = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
sckt.Bind(endpoint);
IPEndPoint senderEndPoint = new IPEndPoint((long)IPAddress.Any.AddressFamily, 0);
EndPoint remote = (EndPoint)endpoint;
Console.WriteLine("Listening");
while (true)
{
// receive data from sender
int recv = sckt.ReceiveFrom(data, ref remote);
// Get sender ip address
senderEndPoint = (IPEndPoint)remote;
Console.WriteLine(senderEndPoint.Address.ToString());
string message = Encoding.ASCII.GetString(data, 0, recv);
// Console.WriteLine(message);
if (message.Equals("test"))
//do something
}
}
С закрытием:
static void Main(string[] args)
{
Console.WriteLine("Listening");
while (true)
{
byte[] data = new byte[1024];
IPEndPoint endpoint = new IPEndPoint(IPAddress.Any, 8888);
Socket sckt = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
sckt.Bind(endpoint);
IPEndPoint senderEndPoint = new IPEndPoint((long)IPAddress.Any.AddressFamily, 0);
EndPoint remote = (EndPoint)endpoint;
//receive data from sender
int recv = sckt.ReceiveFrom(data, ref remote);
//Get sender ip address
senderEndPoint = (IPEndPoint)remote;
Console.WriteLine(senderEndPoint.Address.ToString());
string message = Encoding.ASCII.GetString(data, 0, recv);
//Console.WriteLine(message);
if (message.Equals("lol"))
//do something
sckt.Close();
}
}