【问题标题】:stucture data sending using udpmulticasting in C#在 C# 中使用 udp 多播发送结构数据
【发布时间】:2015-06-22 13:11:11
【问题描述】:

我正在尝试通过将其转换为字节数组来多播结构数据。下面的代码一切正常,除了字符串变量的结构数据在客户端没有收到,因为它是从服务器发送的,而是显示空字符串或其他字符。请建议我解决这个问题。

谢谢你。

这是我的代码:

服务器代码

 struct CIFSPacket
        {
            public int quantity;
            public double price;
            public string Buffer;
        }
        static void Main(string[] args)
        {
            Socket server=null;
            try
            {
                server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                IPEndPoint iep = new IPEndPoint(IPAddress.Parse("224.100.0.1"), 9050);

                int i = 0;
                while (true)
                {
                    byte[] structData = new byte[4096];
                    //server.sendto
                    CIFSPacket pkt = new CIFSPacket();
                    pkt.quantity = i++;
                    pkt.price = i + 0.12;
                    pkt.Buffer = "RELIANCE";                    
                    structData = StructureToByteArray(pkt);
                    server.SendTo(structData, iep);                                        
                    Console.WriteLine(pkt.Buffer+" - "+pkt.quantity+" - "+pkt.price);                    
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            finally
            {
                if (server != null)
                    server.Close();
            }
        }
private static byte[] StructureToByteArray(CIFSPacket str) 
        {
            int size = Marshal.SizeOf(str);
            byte[] arr = new byte[size];
            IntPtr ptr = Marshal.AllocHGlobal(size);

            Marshal.StructureToPtr(str, ptr, true);
            Marshal.Copy(ptr, arr, 0, size);
            Marshal.FreeHGlobal(ptr);

            return arr;
        }

客户代码

public struct CIFSPacket
        {
            public int quantity;
            public double price;
            public string Buffer;
        }

static void Main(string[] args)
        {
            Socket sock = null;
            CIFSPacket pkt;
            try
            {
                sock = new Socket(AddressFamily.InterNetwork,
                SocketType.Dgram, ProtocolType.Udp);
                Console.WriteLine("Ready to receive…");
                IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050);
                EndPoint ep = (EndPoint)iep;
                sock.Bind(iep);
                sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership,
                    new MulticastOption(IPAddress.Parse("224.100.0.1")));

                while (true)
                {
                    byte[] data = new byte[4096];                    
                    int recv = sock.ReceiveFrom(data, ref ep);                    
                    pkt = ByteArrayToStructure(data);
                    Console.WriteLine(pkt.Buffer + " -- " + pkt.quantity + " -- " + pkt.price);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            finally
            {
                sock.Close();
                Console.ReadLine();
            }            
        }

private static CIFSPacket ByteArrayToStructure(byte[] arr)
        {
            CIFSPacket str = new CIFSPacket();
            int size = Marshal.SizeOf(str);
            IntPtr ptr = Marshal.AllocHGlobal(size);
            Marshal.Copy(arr, 0, ptr, size);

            str = (CIFSPacket)Marshal.PtrToStructure(ptr, str.GetType());
            Marshal.FreeHGlobal(ptr);

            return str;
        }

输出

【问题讨论】:

    标签: c# multicast multicastsocket


    【解决方案1】:

    问题是结构中的string 类型是托管指针,而不是值类型。

    尝试替换

     public string Buffer;
    

     [MarshalAsAttribute(UnmanagedType.LPArray, ArraySubType=UnmanagedType.U2, SizeConst=Max_Size_Of_Your_String)]
     public char[] Buffer=new char[Max_Size_Of_Your_String];
    

    或者,您应该能够使用

    [MarshalAsAttribute(UnmanagedType.XXX)]
    

    在您的public string Buffer 声明上,告诉编译器如何将您的字符串转换为字节/从字节转换。 XXX 是受支持的字符串类型之一,例如 LPStr。但在这种情况下,您需要在相应的属性中指定字符串和/或结构的最大大小,以便编译器知道为您的字符串分配多少空间。

    您可能需要查看以下文章以获取更多信息:

    https://limbioliong.wordpress.com/2011/08/28/passing-managed-structures-with-strings-to-unmanaged-code-part-3/

    convert struct handle from managed into unmanaged C++/CLI

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 2016-07-26
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 2019-01-12
      • 1970-01-01
      相关资源
      最近更新 更多