socket.BeginReceive(buf, 0, len_receive_buf, SocketFlags.None, new AsyncCallback(CallReceive), this);
/// <summary>
/// 根据数据包内容设置各字段
/// </summary>
/// <param name="buf"></param>
public void SetArgs(byte[] buf)
{
if( buf == null )
{
return;
} string tempReceiveString = BitConverter.ToString( buf ); m_PackageLength = Convert.ToInt32( tempReceiveString.Substring(6, 2), 16 ) * 16 * 16
+ Convert.ToInt32( tempReceiveString.Substring(9, 2), 16 );
string receiveString = tempReceiveString.Substring(0, m_PackageLength * 3 - 1);
m_IPHeaderLength = Convert.ToInt32( receiveString.Substring(1, 1), 16 ) * 4;
m_IPHeaderContent = receiveString.Substring( 0, m_IPHeaderLength * 3 - 1 ); m_IPVersion = m_IPHeaderContent.Substring( 0, 1 );
string protocol = m_IPHeaderContent.Substring(27, 2);
switch(protocol)
{
case "01": 
m_Protocol = "ICMP"; 
break;
case "02": 
m_Protocol = "IGMP"; 
break;
case "06": 
m_Protocol = "TCP"; 
break;
case "11": 
m_Protocol = "UDP"; 
break;
default: 
m_Protocol = "OTHER"; 
break;
} string originationIPAddress = m_IPHeaderContent.Substring( 36, 11 );
m_OriginationIPAddress = getIPAddress( originationIPAddress ); string destinationIPAddress = m_IPHeaderContent.Substring( 48, 11 );
m_DestinationIPAddress = getIPAddress( destinationIPAddress ); m_MessageLength = m_PackageLength - m_IPHeaderLength;
m_MessageContent = receiveString.Substring( m_IPHeaderLength * 3 );

try // 这两个字段没用到,但读出来的TCPHeaderLength有可能为空,之后读内容就会因为长度为-1而报错。具体原因待查
{
m_TCPHeaderLength = Convert.ToInt32( m_MessageContent.Substring(36, 1), 16 ) * 4;
m_TCPHeaderContent = m_MessageContent.Substring( 0, m_TCPHeaderLength * 3 - 1 );
}
catch
{
} m_OriginationPort = ( Convert.ToUInt32( m_MessageContent.Substring(0, 2), 16 ) * 16 * 16
+ Convert.ToUInt32( m_MessageContent.Substring(3, 2), 16 ) ).ToString();
m_DestinationPort = ( Convert.ToUInt32( m_MessageContent.Substring(6, 2), 16 ) * 16 * 16
+ Convert.ToUInt32( m_MessageContent.Substring(9, 2), 16 ) ).ToString();
}我想从socket中取到URL地址,不知道buf里有没有,目前能取到ip地址等,急需取到url地址,谢谢

解决方案 »

  1.   

    URL地址属于TCP下一层的协议的东西,以HTTP协议为例,先确定包为TCP协议,然后再分析其内容是否为HTTP协议,最后分析HTTP HEADER中的内容就行了
      

  2.   

    我可以确定是否为tcp,那么如何判断是否是http协议呢,最后http header中如何取出url呢
    大侠,能否多说一些,万分感谢,困扰我好久了
      

  3.   

    这是我可以取到的信息,请问我该如何取到URL呢
    -- 源IP:     192.168.20.148
    -- 源端口号: 14839
    -- 目标IP:   60.8.63.90
    -- 目标端口号:80
    -- 协议类型: TCP
    -- 数据包长: 64
    -- 包头长度: 20
    -- 包头内容: 45-00-00-40-EE-04-40-00-40-06-FC-14-C0-A8-14-94-3C-08-3F-5A
    -- 消息长度: 44
    -- 消息内容: 39-F7-00-50-A1-1E-D8-AD-00-00-00-00-B0-02-FF-FF-31-4C-00-00-02-04-05-B4-01-03-03-03-01-01-08-0A-00-00-00-00-00-00-00-00-01-01-04-02
      

  4.   

    是否HTTP协议,判断是否80端口啊。
      

  5.   

    那按你说的我上边贴的就是一个http协议,那么我应该怎么取到URL呢
    我大菜鸟,请高人指点,不胜感激!
      

  6.   

    tcp不管上层协议,传输的什么数据与tcp无关,这个需要你按照http协议的格式去解析
      

  7.   

    我想做一个监控,当浏览器进入某个网站时,屏蔽这个网站或者关闭浏览器
    首先要可以实时监控url,请大虾们帮帮我啊
      

  8.   

    你贴的这个应该是TCP的,而不是HTTP的。
    实际上,若不是以二进制数据提交(上传文件时会使用),HTTP协议头就是一个字符串。
    你可以参考下
    http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html
      

  9.   

    给你一个建议(如果你是做一个没用的东西玩玩就算了),使用HttpListener,而不是什么socket。HttpListener封装有一系列比较专业的http机制解析,干什么不用?
      

  10.   

    我试了一下,但是貌似只能输入ip地址,如果我想屏蔽某个网站,比如www.sina.com.cn的话
    应该怎么做呢