110,538
社区成员
发帖
与我相关
我的任务
分享
[Serializable]
[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
class TMsgHeadInfo
{
public char[] MsgCode;
public char[] MsgType;
public byte SenderType;
public char[] Sender;
public byte ReceiverType;
public char[] Receiver;
public int TotalLength;
public char[] VerifyCode;
public TMsgHeadInfo()
{
MsgCode = new char[2];
MsgType = new char[2];
SenderType = 1;
Sender = new char[6];
ReceiverType = 4;
Receiver = new char[6];
TotalLength = 0;
VerifyCode = new char[32];
}
}
//02报文 单检指令报文体
[Serializable]
[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
class TDevCheck
{
public byte DevType;
public char[] DevCode;
public Int32 OutTime;
public TDevCheck()
{
DevType = 0;
DevCode = new char[10];
OutTime = 0;
}
}
//02报文
[Serializable]
[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
class TDevChecks
{
public TMsgHeadInfo MsgHead;
public TDevCheck DevCheck;
public TDevChecks()
{
MsgHead = new TMsgHeadInfo();
DevCheck = new TDevCheck();
}
}
public bool SendCheckDev(byte ADevType,TextBox txt)
{
TDevChecks DevChecks = new TDevChecks();
DevChecks.MsgHead.MsgCode = "02".ToCharArray();
DevChecks.MsgHead.MsgType = "00".ToCharArray();
//DevChecks.MsgHead.Receiver = "000000".ToCharArray();
DevChecks.MsgHead.ReceiverType = 4;
DevChecks.MsgHead.Sender = Global.sLocalCode.ToCharArray();
DevChecks.MsgHead.SenderType = 1;
DevChecks.MsgHead.TotalLength = 0;
DevChecks.DevCheck.DevCode = DevCode.ToCharArray();
DevChecks.DevCheck.DevType = ADevType;
DevChecks.DevCheck.OutTime = Global.nCheckOutTime;
DevChecks.MsgHead.VerifyCode = Global.tool.MD5Byte(Global.tool.GetBinaryFormatData(DevChecks.DevCheck)).ToCharArray();
//此处需要一个对报文体进行MD5加密
MemoryStream ms = new MemoryStream();
BinaryWriter bw = new BinaryWriter(ms, Encoding.GetEncoding("GB2312"));
bw.Write(DevChecks.MsgHead.MsgCode);
bw.Write(DevChecks.MsgHead.MsgType);
bw.Write(DevChecks.MsgHead.Receiver);
bw.Write(DevChecks.MsgHead.ReceiverType);
bw.Write(DevChecks.MsgHead.Sender);
bw.Write(DevChecks.MsgHead.SenderType);
bw.Write(DevChecks.MsgHead.TotalLength);
bw.Write(DevChecks.MsgHead.VerifyCode);
bw.Write(DevChecks.DevCheck.DevCode);
bw.Write(DevChecks.DevCheck.DevType);
bw.Write(DevChecks.DevCheck.OutTime);
//发送单检命令
txt.Text = "正在连接服务器....";
string sErr = "";
if (!ConnectServer(out sErr))
{
txt.Text = txt.Text + Environment.NewLine + "执行设备单检命令时,连接服务器失败:" + sErr;
return false;
}
txt.Text = txt.Text + Environment.NewLine + "开始发送单检命令....";
try
{
tcpclient.Client.Send(ms.ToArray());
}
catch (Exception ex)
{
tcpclient.Client.Disconnect(true);
txt.Text = txt.Text + Environment.NewLine + "发送单检命令时出现异常:" + ex.Message;
return false;
//throw;
}
//读取服务器回复
if (!tcpclient.Connected)
{
txt.Text = txt.Text + Environment.NewLine + "读取服务器回复信息时,网络断开:" + sErr;
return false;
}
TResponseMsgHead resp = new TResponseMsgHead();
byte[] Response = new byte[Marshal.SizeOf(resp)];
try
{
tcpclient.Client.Receive(Response, Response.Length, SocketFlags.None);
}
catch (Exception ex)
{
//tcpclient.Client.Disconnect(true);
txt.Text = txt.Text + Environment.NewLine + "读取服务器回复信息时发生异常:" + ex.Message;
return false;
//throw;
}
//校验
//成功或失败
if (((TResponseMsgHead)(Global.tool.RetrieveObject(Response))).RecResult == 0)
{
txt.Text = txt.Text + Environment.NewLine + "服务器执行指令成功,等待返回检测结果...";
}
else
{
txt.Text = txt.Text + Environment.NewLine + "服务器执行指令失败:" + ((TResponseMsgHead)(Global.tool.BytesToStruct(Response, resp.GetType()))).Description;
return false;
}
if (tcpclient.Client.Connected)
tcpclient.Client.Disconnect(true);
return true;
}
public string MD5Byte(byte[] by)
{
string pwd = "";
MD5 md5 = MD5.Create();
byte[] s = md5.ComputeHash(by);
for (int i = 0; i < s.Length; i++)
{
pwd = pwd + s[i].ToString("X");
}
return pwd;
}
public object RetrieveObject(byte[] binaryData)
{
MemoryStream memStream = new MemoryStream(binaryData);
IFormatter brFormatter = new BinaryFormatter();
Object obj = brFormatter.Deserialize(memStream);
return obj;
}
public static byte[] GetBinaryFormatData(object msg)
{
byte[] binaryDataResult = null;
MemoryStream memStream = new MemoryStream();
IFormatter brFormatter = new BinaryFormatter();
brFormatter.Serialize(memStream, msg);
binaryDataResult = memStream.ToArray();
memStream.Close();
memStream.Dispose();
return binaryDataResult;
}
public static object RetrieveObject(byte[] binaryData)
{
MemoryStream memStream = new MemoryStream(binaryData);
IFormatter brFormatter = new BinaryFormatter();
Object obj = brFormatter.Deserialize(memStream);
return obj;
}
网上找的,其他人提供的和这段代码大同小异,另外,用C#发结构时,如果结构体里有汉字,就会有错误,需要将编码改成UNICODE,但是接收到的如果用UNICODE就会有乱码,我想应该另一端的程序没用UNICODE吧
//报文头
[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
struct TMsgHeadInfo
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public char[] MsgCode;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public char[] MsgType; public byte SenderType;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public char[] Sender; public byte ReceiverType;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public char[] Receiver; public int TotalLength;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public char[] VerifyCode;
}
//01 报文 设备基本信息
[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
struct TDevInfo
{
public byte DevType;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public char[] DevCode;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 14)]
public char[] CheckTime;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public char[] ErrorStr;
public Int32 CheckError;
}
//02报文 单检指令报文体
[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
struct TDevCheck
{
public byte DevType;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public char[] DevCode;
public Int32 OutTime;
}
//02报文
[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
struct TDevChecks
{
public TMsgHeadInfo MsgHead;
public TDevCheck DevCheck;
}
接收代码如下
TResponseMsgHead resp;
resp.MsgHead.MsgCode = "00".ToCharArray();
resp.MsgHead.MsgType = "00".ToCharArray();
resp.MsgHead.Receiver = "000000".ToCharArray();
resp.MsgHead.ReceiverType = 1;
resp.MsgHead.Sender = "000000".ToCharArray();
resp.MsgHead.SenderType = 2;
resp.MsgHead.TotalLength = 0;
resp.MsgHead.VerifyCode = new char[32];
resp.RecResult = 1;
resp.Description = new char[128];
byte[] Response = Global.tool.StructToBytes(resp);
try
{
tcpclient.Client.Receive(Response, Response.Length, SocketFlags.None);
Application.DoEvents();
//tcpclient.Client.Receive(Response, Response.Length, SocketFlags.None);
}
catch (Exception ex)
{
//tcpclient.Client.Disconnect(true);
txt.Text = txt.Text + Environment.NewLine + "读取服务器回复信息时发生异常:" + ex.Message;
//throw;
}
;
if (((MTWS.Net.TResponseMsgHead)(Global.tool.BytesToStruct(Response, resp.GetType()))).RecResult==0)
{
txt.Text = txt.Text + Environment.NewLine + "服务器执行指令成功,等待返回检测结果...";
}
else
{
txt.Text = txt.Text + Environment.NewLine + "服务器执行指令失败:" + new string(((MTWS.Net.TResponseMsgHead)(Global.tool.BytesToStruct(Response, resp.GetType()))).Description);
}