augehende TCP Packete "abhören"

E

EliteLucker

Guest
http://www.hardwareluxx.de/community/showthread.php?t=641659

es geht speziell um diesen Code
Code:
using System.Net.Sockets;
...
private Socket receiveSocket;
private byte[] byteData = new byte[4096];
...
receiveSocket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
receiveSocket.Bind(new IPEndPoint(IPAddress.Parse(strLocalIP), 0));
receiveSocket.SetSocketOption(SocketOptionLevel.IP , SocketOptionName.HeaderIncluded, true);
byte[] byTrue = new byte[4] { 1, 0, 0, 0 };
byte[] byOut = new byte[4] { 1, 0, 0, 0 };
receiveSocket.IOControl(IOControlCode.ReceiveAll, byTrue, byOut);
receiveSocket.BeginReceive(byteData, 0, byteData.Length, SocketFlags.None, new AsyncCallback(OnReceive), null);
...
private void OnReceive(IAsyncResult ar)
{
try
{
int nReceived = receiveSocket.EndReceive(ar);

ParseData(byteData, nReceived);

if (!bStopCapturing)
{
byteData = new byte[4096];

receiveSocket.BeginReceive(byteData, 0, byteData.Length, SocketFlags.None, new AsyncCallback(OnReceive), null);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Title", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

wie genau kann ich in meinem Fall nun auch ausgehende Packete abhören um dann im Spiel bestimmte ereignisse auszulösen

zB wenn "1004" gesendet wird mache LabelX grün

danke
 
Zuletzt bearbeitet:
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Damit Pakete rausgehen musst du sie ja auch senden. Und was du sendest kannst du ja vorher oder nachher per switch- oder selectcase oder dergleichen abfragen, also nach folgendem Muster (ich mach das ganze mal nach VB-Muster zur veranschaulichung):

Code:
dim sendPackets as byte
recieveSocket.Send(sendPackets)
select case Encoding.ASCII.GetString(sendPackets) 'Oder je nachdem welchen Datentyp du auslesen willst
case x, y, z
'mach label x grün
end select
So im groben.

Falls beim senden was schief geht wegen einer Firewall oder dergleichen, wird das sowieso vorher von der exception abegefangen. Was anderes fällt mir da momentan nicht ein.
 
Ist das deine eigene Anwendung deren Pakete du abhoeren willst?
 
Es ist als erweiterung zu was bestehendem gedacht.
Ich hab ne WebBrowser komponente in meiner Form. dort läut nen Flashgame drin an hand dieses Flashgames soll nun ein weiter Teil in der Form angesprochen werden.
Also wenn ich im Flash zB eine bestimmte stelle klicke wird vom Flash was gesendet auf das gesendete will ich nun reagieren, es sollen keinerlei inhaltte geändert werden lediglich den inhalt ausgelesen und ggf reagiert werden

Habe bisher das hier
Code:
bFilterDestIPisIP = FilterDestAdr.CompareTo(ipHeader.DestinationAddress.ToString()) == 0;
...
                    // Ausgehende Packete
                    if (bFilterDestIPisIP)
                    {
                        if (ipHeader.ProtocolType == Protocol.TCP)
                        {
                            arrBytes = tcpHeader.Data;

                            foreach (Byte b in arrBytes)
                            {
                                chr = (char)b;

                                if (chr.CompareTo('\0') == 0)
                                {
                                    break;
                                }

                                temp += chr.ToString();
                            }

                            if (temp.StartsWith(actionSendTypes[0]))
                            {
#if DEBUG
                                LogList.Add(CreateLogText("|Fall 1|" + temp));
#endif
                            }
                        }
                    }

er springt hier auch mal rein aber nie in den Fall LogList.Add(CreateLogText("|Fall 1|" + temp)); denn in der Log steht nix

einkommende Packete werden so genaus so gefilter und das geht
Code:
bFilterSrcIPisIP = FilterLocalAdr.CompareTo(ipHeader.SourceAddress.ToString()) == 0;
...
// Eingehende Packete
                    if (bFilterSrcIPisIP)
                    {
                        if (ipHeader.ProtocolType == Protocol.TCP)
                        {
                            sfServerPort = int.Parse(tcpHeader.SourcePort);

                            arrBytes = tcpHeader.Data;

                            foreach (Byte b in arrBytes)
                            {
                                chr = (char)b;

                                if (chr.CompareTo('\0') == 0)
                                {
                                    break;
                                }

                                temp += chr.ToString();
                            }

                            if (bFirstPacketReceived)
                            {
                                  ...
                                if (firstField.StartsWith(actionTypes[0]))
                                {
                                    if (temp.Contains(";"))
                                    {
#if DEBUG
                                        LogList.Add(CreateLogText("|Fall 01|" + temp));
#endif
 
Zuletzt bearbeitet:
neues Problem:
Das empfangen funktioniert nun soweit
Code:
private Socket sendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);

public void SendCommand(String command)
{
    try
    {
        sendSocket.Connect(new IPEndPoint(IPAddress.Parse(FilterDestAdr), sfServerPort));
        sendSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true);
        System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
        enc.GetBytes(command).CopyTo(byteDataOut, 0);

        sendSocket.BeginSend(byteDataOut, 0, byteDataOut.Length, SocketFlags.None, new AsyncCallback(OnSend), null);
    }
    catch (Exception ex)
    {
        MessageBox.Show("SendCommand \n" + ex.Message, "Title", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

public void OnSend(IAsyncResult ar)
{
    //try
    //{
    //    int nSend = sendSocket.EndSend(ar);
    //}
    //catch (Exception ex)
    //{
    //    MessageBox.Show("OnSend \n" + ex.Message, "Title", MessageBoxButtons.OK, MessageBoxIcon.Error);
    //}
}

Wenn ich bei OnSend(IAsyncResult ar) den Code wieder entkommentiere kommt eine Excption WSACancelCallBack

Wie kann ich einfach einen String senden ?


Ok es liegt wohl daran das ich für den Server noch die HTML Sachen mitschicken muss. Ich kann aber einem TCPHeader.Data keine Sachen zuweisen da ReadOnly.
Wie kann ich nun das ganze aufbauen, das ich das Gerüst zum senden endlich hinbekomme
 
Zuletzt bearbeitet:
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh