2016-08-04 54 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

相關問題