У меня есть серверное приложение, написанное на C, которое должно отправить скриншот throguh socket и C# gui client. Проблема в том, что я не могу преобразовать массив байтов в структуру из-за исключения. Простое задание массива char для struct в C/C++, но не так просто в C#. Вот тестовый код:Исключение при преобразовании байтового массива в структуру
public partial class Form1 : Form
{
const int magic = 101;
enum command {GET_SCREEN = 1, MOVE_MOUSE, CLICK_MOUSE };
public struct send_packet
{
public int magic;
public int cmd;
};
public struct recv_packet
{
public int magic;
public int code;
public int length;
public byte[] body;
};
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
int port = 4000;
TcpClient client = new TcpClient("127.0.0.1", 4000);
NetworkStream nws = client.GetStream();
BinaryWriter bw = new BinaryWriter(nws);
BinaryReader br = new BinaryReader(nws);
byte[] buff = new byte[512];
send_packet pkt = new send_packet();
pkt.magic = magic;
pkt.cmd = (int)command.GET_SCREEN;
while (true)
{
bw.Write(pkt.magic);
bw.Write(pkt.cmd);
br.Read(buff, 0, 512);
GCHandle pinnedPacket = GCHandle.Alloc(buff, GCHandleType.Pinned);
recv_packet rcv_pkt = (recv_packet)Marshal.PtrToStructure(pinnedPacket.AddrOfPinnedObject(), typeof(recv_packet));
//string str = System.Text.Encoding.Default.GetString(rcv_pkt.length);
string str = rcv_pkt.length.ToString();
MessageBox.Show(str);
}
}
}
Что это может быть? Текст исключения на русском языке, но есть самая важная информация: «System.AccessViolationException» в mscorlib.dll, попытка чтения или записи в защищенную память. Что-то вроде того. Это происходит прямо в этой строке recv_packet rcv_pkt = (recv_packet)Marshal.PtrToStructure(pinnedPacket.AddrOfPinnedObject(), typeof(recv_packet));
Здесь я получил объяснение, почему это не работает и своего рода решения https://social.msdn.microsoft.com/Forums/vstudio/en-US/3c152957-91e7-43bf-91de-a047a3d124f5/exception-when-converting-byte-array-to-structure?forum=csharpgeneral
Что такое excep и точно, когда это произойдет? – Culme
Я только что обновил сообщение с этой информацией. –
Таким образом, это может быть проще .. http://stackoverflow.com/a/21510978/932418 – Eser