Question

J'ai une application qui montre un composant WebBrowser, qui contient une application flash qui créent un XMLSocket avec un serveur. Je suis maintenant essayer de brancher recv (luckly un LocalHook) pour purpuse journal, mais lorsque je tente de lire le contenu socket j'obtenir que les caractères étranges, mais si je mets le crochet avec SpyStudio-je obtenir des chaînes lisibles. Voici le code que je utilise:

  1. I défini avec le crochet

    CreateRecvHook = LocalHook.Create(
        LocalHook.GetProcAddress("ws2_32.dll", "recv"),
        new Drecv(recv_Hooked),
        this);
    
    
    CreateRecvHook.ThreadACL.SetExclusiveACL(new Int32[] { 0 });
    
  2. Je mis en place tout ce que je besoin avec

    [DllImport("ws2_32.dll")]
    static extern int recv(
                IntPtr socketHandle,
                IntPtr buf,
                int count,
                int socketFlags
        );
    
    
    [UnmanagedFunctionPointer(CallingConvention.StdCall,
        CharSet = CharSet.Unicode,
        SetLastError = true)]
    
    
    delegate int Drecv(
                IntPtr socketHandle,
                IntPtr buf,
                int count,
                int socketFlags
        );
    
    
    static int recv_Hooked(
                IntPtr socketHandle,
                IntPtr buf,
                int count,
                int socketFlags)
    {
        byte[] test = new byte[count];
        Marshal.Copy(buf, test, 0, count);
    
    
    
    IntPtr ptr = IntPtr.Zero;
    
    
    ptr = Marshal.AllocHGlobal(count);
    Marshal.Copy(test, 0, ptr, count);
    
    
    string s = System.Text.UnicodeEncoding.Unicode.GetString(test);
    Debug.WriteLine(s);
    System.IO.StreamWriter file = new System.IO.StreamWriter("log.txt");
    file.WriteLine(s);
    
    
    file.Close();
    return recv(socketHandle, buf, count, socketFlags);;
    
    }

Je l'ai déjà essayé d'utiliser un codage différent sans succès. Comme une note de côté, ne semble WebBrowser pas avoir de problème.

Était-ce utile?

La solution

Vous vous enregistrez le contenu de la mémoire tampon non initialisée, pas étonnant que ce soit des déchets.

Il n'y a rien dans ce tampon qu'après recv (le vrai) le remplit. Vous savez pouvez pas non plus combien d'octets sont en fait valables sauf en inspectant le code de retour du réel recv.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top