C# UDP -Server Asynchron Multiple Clients | SocketException, wenn der Client die Verbindung trennenC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 C# UDP -Server Asynchron Multiple Clients | SocketException, wenn der Client die Verbindung trennen

Post by Anonymous »

Ich habe an einem Socket -Server -Programm in C# gearbeitet (ich war von diesem Beitrag inspiriert) und mein Problem ist, dass ein Client eine Ausnahme abnimmt. Ich verstehe nicht, warum meine doreceiveFrom () Funktion aufgerufen wird, wenn es nichts zu lesen gibt. Ich habe wahrscheinlich etwas verpasst. Was ist falsch?int dataLen = this.serverSocket.EndReceiveFrom(iar, ref clientEP);
< /code>

Der vollständige Quellcode: < /p>

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();
}
}
< /code>

Ausnahme: < /p>

An existing connection was forcibly closed by the remote host
< /code>



Update: < /strong>
Ich habe versucht, meinen Client (netcat) auf einem anderen PC auszuführen, und die Ausnahme erscheint nicht mehr, selbst wenn sendto () < /strong> auch problematisch, um meine Client zu löschen.>

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post