4

TCP を介して機器の管理インターフェイスと対話するプログラムを作成しています。問題は、機器のドキュメントが C で書かれているのに、私が書いているプログラムは C# で書かれていることです。私の問題は、ドキュメントが指定していることです

通信は、C 構造体ベースの API バッファに基づいています。

この API や、生の構造を TCP 経由で送信する方法について、Google で調べてもわかりません。ドキュメントは、memcpy を使用して構造体を TCP バッファーにコピーする必要があることを暗示しているようですが、C# は memcpy を直接サポートしていません。C#に同等の方法がありますか、それともこれを達成する別の方法がありますか

4

2 に答える 2

5

C 構造体の .Net バージョンを作成し、マーシャリングを使用してネットワーク経由でバイト配列を送信できます。MLocationC 構造体の例を次に示します。

[StructLayout(LayoutKind.Sequential, Pack = 8)]
public struct MLocation
{
    public int x;
    public int y;
};

public static void Main()
{
    MLocation test = new MLocation();

    // Gets size of struct in bytes
    int structureSize = Marshal.SizeOf(test);

    // Builds byte array
    byte[] byteArray = new byte[structureSize];

    IntPtr memPtr = IntPtr.Zero;

    try
    {
        // Allocate some unmanaged memory
        memPtr = Marshal.AllocHGlobal(structureSize);

        // Copy struct to unmanaged memory
        Marshal.StructureToPtr(test, memPtr, true);

        // Copies to byte array
        Marshal.Copy(memPtr, byteArray, 0, structureSize);
    }
    finally
    {
        if (memPtr != IntPtr.Zero)
        {
            Marshal.FreeHGlobal(memPtr);
        }
    }

    // Now you can send your byte array through TCP
    using (TcpClient client = new TcpClient("host", 8080))
    {
        using (NetworkStream stream = client.GetStream())
        {
            stream.Write(byteArray, 0, byteArray.Length);
        }
    }

    Console.ReadLine();
}
于 2012-08-14T14:59:01.207 に答える
0

安全でない構造体、BitConverter を使用するか、マネージ C++ ラッパーを記述して API バッファーを埋めます。
基本的に、関数を呼び出す代わりにソケットを呼び出して P/Invoke を実行しています。

于 2012-08-14T14:33:48.263 に答える