socket编程中结构体与字节流转换出现的问题
先给大家看段代码:
这是我定义的一个结构体,
[StructLayout(LayoutKind.Sequential, Size = 12, CharSet = CharSet.Ansi)]
public struct SessionKeyMessage
{
[MarshalAs(UnmanagedType.U2)]
public ushort message_len;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 2)]
public string message_id;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
public string session_key;
}
下面为将字节流转换为结构体的方法:
public static object BytesToStruct(byte[] bytes, Type strcutType)
{
int size = Marshal.SizeOf(strcutType);
IntPtr buffer = Marshal.AllocHGlobal(size);
try
{
Marshal.Copy(bytes, 0, buffer, size);
return Marshal.PtrToStructure(buffer, strcutType);
}
finally
{
Marshal.FreeHGlobal(buffer);
}
}
在BUTTON事件中,做了如下处理:
private void ReceiveSessionKey()
{
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(host, port);
if (!socket.Connected)
MessageBox.Show("not connected");
byte[] recvBytes = new byte[1024];
int bytes = 0;
bytes = socket.Receive(recvBytes, recvBytes.Length, SocketFlags.None);
skm = new SessionKeyMessage();
skm = (SessionKeyMessage)NetStreamUtil.BytesToStruct(recvBytes, skm.GetType());
using (StreamWriter sw = new StreamWriter("11.txt", false, Encoding.Default))
{
sw.WriteLine(skm.message_len);
sw.WriteLine(skm.message_id);
sw.WriteLine(skm.session_key + ' ' + skm.session_key.Length);
}
}
结果发现message_id和session_key两个成员的值比实际的值都少了一个字符,被右截位了。
请教一下,上面的代码有何问题,调试了一天了,怎么也查不出来。我把网络字节流通过Encoding.ASCII.GetString()
方法转换后取得的字符串部分看确实比上面的办法取出来的要多一个字符
请各位大大帮帮忙,万发火急