UDP-сервер асинхронно с несколькими клиентами | SocketException при отключении клиентаC#

Место общения программистов C#
Ответить
Anonymous
 UDP-сервер асинхронно с несколькими клиентами | SocketException при отключении клиента

Сообщение Anonymous »

Я работал над программой сервера сокетов на C# (меня вдохновил этот пост), и моя проблема заключается в том, что когда клиент отключает исключение «Существующее соединение было принудительно закрыто удаленным хостом», появляется при вызове EndReceiveFrom() и возвращает 0, ref clientEP становится обычно закрытым клиентом. Я не понимаю, почему моя функция DoReceiveFrom() вызывается, если читать нечего. Наверное, я что-то пропустил. Что не так?

Проблема здесь:

Код: Выделить всё

int dataLen = this.serverSocket.EndReceiveFrom(iar, ref clientEP);
Полный исходный код:

Код: Выделить всё

class UDPServer
{
private Socket serverSocket = null;
private List clientList = new List();
private List dataList = new List();
private byte[] byteData = new byte[1024];
private int port = 4242;

public List DataList
{
private set { this.dataList = value; }
get { return (this.dataList); }
}

public UDPServer(int port)
{
this.port = port;
}

public void Start()
{
this.serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
this.serverSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
this.serverSocket.Bind(new IPEndPoint(IPAddress.Any, this.port));
EndPoint newClientEP = new IPEndPoint(IPAddress.Any, 0);
this.serverSocket.BeginReceiveFrom(this.byteData, 0, this.byteData.Length, SocketFlags.None, ref newClientEP, DoReceiveFrom, newClientEP);
}

private void DoReceiveFrom(IAsyncResult iar)
{
try
{
EndPoint clientEP = new IPEndPoint(IPAddress.Any, 0);
int dataLen = this.serverSocket.EndReceiveFrom(iar, ref clientEP);
byte[] data = new byte[dataLen];
Array.Copy(this.byteData, data, dataLen);

if (!this.clientList.Any(client => client.Equals(clientEP)))
this.clientList.Add(clientEP);

EndPoint newClientEP = new IPEndPoint(IPAddress.Any, 0);
this.serverSocket.BeginReceiveFrom(this.byteData, 0, this.byteData.Length, SocketFlags.None, ref newClientEP, DoReceiveFrom, newClientEP);

DataList.Add(Tuple.Create(clientEP, data));
}
catch (ObjectDisposedException)
{
}
}

public void SendTo(byte[] data, EndPoint clientEP)
{
try
{
this.serverSocket.SendTo(data, clientEP);
}
catch (System.Net.Sockets.SocketException)
{
this.clientList.Remove(clientEP);
}
}

public void SendToAll(byte[] data)
{
foreach (var client in this.clientList)
{
this.SendTo(data, client);
}
}

public void Stop()
{
this.serverSocket.Close();
this.serverSocket = null;

this.dataList.Clear();
this.clientList.Clear();
}
}
Исключение:

Код: Выделить всё

An existing connection was forcibly closed by the remote host


Обновление:
Я попытался запустить свой клиент (netcat) на другом компьютере, и исключение больше не появляется, даже если SendTo(), что также проблематично удалить мой клиент в моем clientList.
Я до сих пор не понимаю, что происходит.

Подробнее здесь: https://stackoverflow.com/questions/235 ... -disconnec
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»