昨天问了截取报文的问题,CSDN上的朋友帮解答了,十分感谢。
可是问题也随之而来。截取到了报文byte[],就要把byte[]转换成string进行解析,我用了3种方法转换:
下文中的myByte是个byte[].
1,string str = Convert.ToBase64String(myByte);
其转换结果是:RQAEv01IQACABnBzwAIB6z2BOQ8I8QBQMoAeRRTjvuNQGP//PS8AAEdFVCAvdGhyZWFkLnBocD......后省略一大串,根本无法解读,看起来像MD5加密的东西,但是我们的网站和我的WebService报文都没有加密
2,string str = BitConverter.ToString(ReceiveClass.PackByte);
其转换的结果是:45-00-00-28-55-B0-40-00-80-06-F5-78-C0-02-01-EB-D3-64-1A-55-09-......后省略一大串
3,string str = Encoding.UTF8.GetString(ReceiveClass.PackByte);其结果更诡异,如果用文本框显示则只有一个"E";如果放到WebBrowser控件中则可以看到:
EFX$@�����I�` vP^5 ��|�jP���GET /common/images/default/menu_mouseover.jpg HTTP/1.1 Accept: */* Referer: http:/......省略一大串,而且感觉后面的HTML也不全,照理我应该拿到XML特求教怎么样来转换这个myByte来得到我想要的报文。
可是问题也随之而来。截取到了报文byte[],就要把byte[]转换成string进行解析,我用了3种方法转换:
下文中的myByte是个byte[].
1,string str = Convert.ToBase64String(myByte);
其转换结果是:RQAEv01IQACABnBzwAIB6z2BOQ8I8QBQMoAeRRTjvuNQGP//PS8AAEdFVCAvdGhyZWFkLnBocD......后省略一大串,根本无法解读,看起来像MD5加密的东西,但是我们的网站和我的WebService报文都没有加密
2,string str = BitConverter.ToString(ReceiveClass.PackByte);
其转换的结果是:45-00-00-28-55-B0-40-00-80-06-F5-78-C0-02-01-EB-D3-64-1A-55-09-......后省略一大串
3,string str = Encoding.UTF8.GetString(ReceiveClass.PackByte);其结果更诡异,如果用文本框显示则只有一个"E";如果放到WebBrowser控件中则可以看到:
EFX$@�����I�` vP^5 ��|�jP���GET /common/images/default/menu_mouseover.jpg HTTP/1.1 Accept: */* Referer: http:/......省略一大串,而且感觉后面的HTML也不全,照理我应该拿到XML特求教怎么样来转换这个myByte来得到我想要的报文。
string str = Encoding.GetEncoding("GB18030").GetString(ReceiveClass.PackByte);
会不会是截取类的问题,
我把截取的方法贴在下面,求指教和指正 using System;
using System.Net;
using System.Net.Sockets;namespace SocketTry
{
class MyRawSocket
{
private IPAddress MyIP;
private bool RunRawSocket = false;
private readonly Socket MySocket; public MyRawSocket(IPAddress MyIPAddress)
{
MyIP = MyIPAddress; MySocket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
MySocket.Blocking = false;
MySocket.Bind(new IPEndPoint(MyIPAddress, 0)); if (SetSocketIOControl() == false) return;
RunRawSocket = true;
} private bool SetSocketIOControl()
{
bool ReturnBool = true;
try
{
MySocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, 1);
var InByte = new byte[4] { 1, 0, 0, 0 };
var OutByte = new byte[4];
var SIO_RCVALL = unchecked((int)0x98000001);
int ScoketCode = MySocket.IOControl(SIO_RCVALL, InByte, OutByte);
ScoketCode = OutByte[0] + OutByte[1] + OutByte[2] + OutByte[3];
if (ScoketCode != 0) ReturnBool = false;
}
catch (SocketException)
{
ReturnBool = false;
}
return ReturnBool;
} public void Star()
{
var Temp = new byte[0];
IAsyncResult StarAsyncResult = MySocket.BeginReceive(Temp, 0, 0, SocketFlags.None, new AsyncCallback(CallReceive), MySocket);
}
public void Stop()
{
RunRawSocket = false;
} private void CallReceive(IAsyncResult ar)
{
var sock = (Socket)ar.AsyncState;
int ReceiveCount = sock.Available; if (ReceiveCount != 0)
{
var Data = new byte[ReceiveCount];
sock.Receive(Data);
AssayByte(Data);
}
if (RunRawSocket) Star();
} /// <summary>
/// 分析数据
/// </summary>
/// <param name="Data"></param>
private void AssayByte(byte[] Data)
{
var MyData = new IPData();
if (Data.Length >= 24)
{ MyData.HeaderLength = (uint)(Data[0] & 0x0F) << 2; MyData.Version = (uint)(Data[0] & 0xF0) >> 4; switch (Data[9])
{
case 1: MyData.Protocol = "ICMP"; break;
case 2: MyData.Protocol = "IGMP"; break;
case 6: MyData.Protocol = "TCP"; break;
case 17: MyData.Protocol = "UDP"; break;
default: MyData.Protocol = "UNKNOWN"; break;
} MyData.OriginationAddress = new IPAddress(new byte[] { Data[12], Data[13], Data[14], Data[15] });
MyData.DestinationAddress = new IPAddress(new byte[] { Data[16], Data[17], Data[18], Data[19] }); MyData.OriginationPort = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(new byte[] { Data[20], Data[21] }, 0));
MyData.DestinationPort = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(new byte[] { Data[22], Data[23] }, 0)); MyData.PacketLength = (uint)Data.Length;
MyData.MessageLength = (uint)Data.Length - MyData.HeaderLength; MyData.PackByte = Data;
}
else
{
MyData.PackByte = Data;
}
if (Receive != null) Receive(MyData);
} public delegate void ReceiveData(IPData ReceiveClass);
public event ReceiveData Receive; public class IPData
{
private string _Protocol = ""; /// <summary>
/// IP头长度
/// </summary>
public uint HeaderLength { get; set; } /// <summary>
/// IP版本
/// </summary>
public uint Version { get; set; } /// <summary>
/// IP协议
/// </summary>
public string Protocol { get { return _Protocol; } set { _Protocol = value; } } /// <summary>
/// 发送IP地址
/// </summary>
public IPAddress OriginationAddress { get; set; } /// <summary>
/// 接收IP地址
/// </summary>
public IPAddress DestinationAddress { get; set; } /// <summary>
/// 发送端口
/// </summary>
public short OriginationPort { get; set; } /// <summary>
/// 接收端口
/// </summary>
public short DestinationPort { get; set; } /// <summary>
/// 接收长度
/// </summary>
public uint PacketLength { get; set; } /// <summary>
/// 消息长度
/// </summary>
public uint MessageLength { get; set; } /// <summary>
/// 包数据
/// </summary>
public byte[] PackByte { get; set; }
} }
}