2016-08-04 17 views
0

使用的TcpListener一个byte []数组,我接收来自客户端和立即尝试一个字节数组来创建(经由Marshal.PtrToStructure)试图转换所接收通过套接字成一个结构

一个stuct出它

这是我到目前为止有:

public static void ClientListener(object obj)      
{ 

    TcpClient client = (TcpClient)obj;        
    NetworkStream netStream = client.GetStream();  
    MemoryStream memStream = new MemoryStream(); 

    byte[] bytes = new byte[client.ReceiveBufferSize];    
    int bytesRead; 
    while((bytesRead = netStream.Read(bytes, 0, bytes.Length)) > 0)  
    { 
     memStream.Write(bytes, 0, bytesRead); 
    } 
    byte[] result = memStream.ToArray();        

    Record test = new Record(); 
    test = ByteToStruct<Record>(result); 
    Console.WriteLine(test.Station);    
    netStream.Close();             
    memStream.Close(); 
    client.Close(); 
    Console.WriteLine("Closed"); 
    //Record test1 = new Record("a", "b", 1, 200, "e", "f", "g", 2, 3, "j", "k"); 
} 

public static Record ByteToStruct<Record>(byte[] data) 
{ 
    GCHandle gch = GCHandle.Alloc(data, GCHandleType.Pinned); 

    try 
    { 
     return (Record)Marshal.PtrToStructure(gch.AddrOfPinnedObject(), typeof(Record)); 
    } 
    finally 
    { 
     gch.Free(); 
    } 
}   

运行这让我:

“型 'System.AccessViolationException' 未处理的异常出现在mscorlib.dll

附加信息:试图读取或写入受保护的内存。这通常是指示其他内存已损坏“

任何意见被广泛赞赏,我是新来的C#

编辑:我忘了,包括记录结构:

public Record(string a, string b, int c, string d, string e, string f, string g, int h, int i, string j, string k) 
    { 
     Console.WriteLine("inside struct 0"); 
     Station = a; 
     UserName = b; 
     EvtActive = c; 
     EvtTime = d; 
     EvtTimeString = e; 
     LocCode = f; 
     LastLoop = g; 
     CompLvl = h; 
     RecordID = i; 
     ConnectTime = j; 
     Notes = k; 

    } 
+0

看起来像你在那里复杂的事情。我认为Record是你的结构?它有一个字节数组属性?如果不是你做什么不行。你需要给它一个属性,这是一个字节[]来做到这一点,你不能只是魔术一个结构有其他类型的。一般而言,C#中的结构会被误解/使用,您最好使用一个类。 – kmcc049

+0

给它一个byte []属性后我会做什么?你是否说在构造函数中的所有变量都是byte []? – MrDysprosium

回答

1

你在这里做出了一个基本的假设 - 你可以简单地从线路中取出一些东西,并在一个结构体中做一个字节冲突(这可能是也可能不是你的直接问题)

更好的是将它从wire field by field using BinaryReader(adn write它使用BinaryWriter如果你拥有发件人)。 BinaryReader可以直接在网络流的顶部实例化,它将尽其所能地等待正确的字节数被接收等。

即。

var br = new BinaryReader(netStream); 
var rec = new Record(); 
rec.Station = br.ReadString(); 
rec.EvtActive = br.ReadInt32(); 
..... 
+0

你说“按字段”,但这是什么意思?当我收到数据(我不拥有发件人)时,它会有一个1324字节的大块。 – MrDysprosium

+0

查看编辑的核心 – pm100

+0

现在,这很有趣。 因此,如果这个客户端(我不拥有)发送大约1324字节的数据,但它总是按照我在Record结构中设置的顺序发送,BinaryReader将采用“第一个”字符串并将其应用到站,然后采取“第二”字符串,并将其应用于用户名等...或者我必须告诉BinaryReader我的字节如何专用于每个变量? 谢谢你的所有帮助顺便说一句,我真的很感激它。 – MrDysprosium

相关问题