我试图通过将struture数据转换为字节数组来对其进行多播。下面的代码一切正常,但字符串变量的结构数据在客户端没有收到,因为它是从服务器发送的,而是显示空字符串或其他字符。请建议我解决这个问题。
非常感谢。
这是我的代码:
ServerCode
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;
}
ClientCode
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;
}
输出
答案 0 :(得分:0)
问题是结构中的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。但在这种情况下,您需要在相应的属性中指定字符串和/或结构的最大大小,以便编译器知道为字符串分配多少空间。
您可能需要查看以下文章以获取更多信息: