roker002
Commander
- Registriert
- Dez. 2007
- Beiträge
- 2.107
Hallo, ich schreibe gerade eine Testapplikation die erlauben sollte GTP Echos abzuschicken. Ein Echo muss aber (wie der Sinn des Echo's ist) auch beantwortet werden.
Dabei Benutze ich UdpClient über mehrere Threads zum versenden und empfangen der GTP nachrichten.
Zu dem Empfang Code:
Es wird für drei Ports jeweils ein Thread erstellt.
Es funktioniert alles. Mein Problem ist aber eh die Fehlerbehandlung.
Wenn die gegenseite nicht erreichbar ist, dann bekomme ich SocketException mit dem Error ConnectionReset. Ich kann aber damit nichts anfangen wenn ich den inhalt der Nachricht nicht bekommen. Ich kann leider auch nicht ReceiveFrom benutzen, da ich bis zu x (große Zahl) nachrichten gleichzeitig versende an viele Verschiedene Server.
Ein Wireshark trace ist als Bild vorhanden.
Es wäre super, wenn man die ICMP Nachricht auslesen kann. Wenn es ja doch nicht gehen sollte, so ist das kein großes Problem.
Danke
Dabei Benutze ich UdpClient über mehrere Threads zum versenden und empfangen der GTP nachrichten.
Zu dem Empfang Code:
Code:
/// <summary>
/// Execute Listening on given UDP port
/// </summary>
/// <param name="parameter">parameter with port number and udpclient</param>
public void ListenUdp(Object parameter)
{
var param = parameter as UdpParameters;
if (param != null)
{
try
{
var version = param.Version;
var ep = new IPEndPoint(IPAddress.Any, param.Port);
param.Client = new UdpClient(new IPEndPoint(IPAddress.Any, param.Port));
param.Client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
int interrupted = 0;
while (StopReceiving == false && interrupted < 10)
{
var array = new Byte[0];
try
{
array = param.Client.Receive(ref ep);
interrupted = 0;
}
catch (SocketException se)
{
if (se.SocketErrorCode == SocketError.Interrupted)
{
interrupted++;
continue;
}
MessageBox.Show("Message Could not be delivered: " + se.SocketErrorCode.ToString());
}
var data = new IncommingMessages { Message = array, Time = DateTime.Now, Version = version, Port = param.Port, FromTo = ep };
///Wait for response
if (data.Type == 1)
{
this.AddIncommingData(data);
var response = PrepareGtpData(data.Message, version);
ep.Port = param.Port;
param.Client.Send(response, response.Length, ep);
data = new IncommingMessages { Time = DateTime.Now, Message = response, Version = version, Port = param.Port, FromTo = ep };
this.AddOutgoingData(data);
}
}
}
finally
{
if (param.Client != null)
param.Client.Close();
}
}
}
Es wird für drei Ports jeweils ein Thread erstellt.
Es funktioniert alles. Mein Problem ist aber eh die Fehlerbehandlung.
Wenn die gegenseite nicht erreichbar ist, dann bekomme ich SocketException mit dem Error ConnectionReset. Ich kann aber damit nichts anfangen wenn ich den inhalt der Nachricht nicht bekommen. Ich kann leider auch nicht ReceiveFrom benutzen, da ich bis zu x (große Zahl) nachrichten gleichzeitig versende an viele Verschiedene Server.
Ein Wireshark trace ist als Bild vorhanden.
Es wäre super, wenn man die ICMP Nachricht auslesen kann. Wenn es ja doch nicht gehen sollte, so ist das kein großes Problem.
Danke