c#中socket截取的http包里怎样可以取到url地址呢

jinmingyuan 2011-12-16 03:03:00



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地址,谢谢
...全文
217 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinmingyuan 2011-12-19
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 sp1234 的回复:]

给你一个建议(如果你是做一个没用的东西玩玩就算了),使用HttpListener,而不是什么socket。

HttpListener封装有一系列比较专业的http机制解析,干什么不用?
[/Quote]
我试了一下,但是貌似只能输入ip地址,如果我想屏蔽某个网站,比如www.sina.com.cn的话
应该怎么做呢
jinmingyuan 2011-12-19
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 sp1234 的回复:]

给你一个建议(如果你是做一个没用的东西玩玩就算了),使用HttpListener,而不是什么socket。

HttpListener封装有一系列比较专业的http机制解析,干什么不用?
[/Quote]
好,我用看看,谢谢你的建议
  • 打赏
  • 举报
回复
给你一个建议(如果你是做一个没用的东西玩玩就算了),使用HttpListener,而不是什么socket。

HttpListener封装有一系列比较专业的http机制解析,干什么不用?
Bullatus 2011-12-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jinmingyuan 的回复:]

引用 4 楼 qwertxp 的回复:

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

那按你说的我上边贴的就是一个http协议,那么我应该怎么取到URL呢
我大菜鸟,请高人指点,不胜感激!
[/Quote]
你贴的这个应该是TCP的,而不是HTTP的。
实际上,若不是以二进制数据提交(上传文件时会使用),HTTP协议头就是一个字符串。
你可以参考下
http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html
jinmingyuan 2011-12-16
  • 打赏
  • 举报
回复
还是没解决。。。
qwertxp 2011-12-16
  • 打赏
  • 举报
回复
建议你先用个现成的抓包工具来抓包分析,然后对你自己的抓的数据包就好处理了。
jinmingyuan 2011-12-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 heters 的回复:]

tcp不管上层协议,传输的什么数据与tcp无关,这个需要你按照http协议的格式去解析
[/Quote]
我想做一个监控,当浏览器进入某个网站时,屏蔽这个网站或者关闭浏览器
首先要可以实时监控url,请大虾们帮帮我啊
bloom_1001 2011-12-16
  • 打赏
  • 举报
回复
tcp不管上层协议,传输的什么数据与tcp无关,这个需要你按照http协议的格式去解析
jinmingyuan 2011-12-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 qwertxp 的回复:]

是否HTTP协议,判断是否80端口啊。
[/Quote]
那按你说的我上边贴的就是一个http协议,那么我应该怎么取到URL呢
我大菜鸟,请高人指点,不胜感激!
qwertxp 2011-12-16
  • 打赏
  • 举报
回复
是否HTTP协议,判断是否80端口啊。
jinmingyuan 2011-12-16
  • 打赏
  • 举报
回复
这是我可以取到的信息,请问我该如何取到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
jinmingyuan 2011-12-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bunliney 的回复:]

URL地址属于TCP下一层的协议的东西,以HTTP协议为例,先确定包为TCP协议,然后再分析其内容是否为HTTP协议,最后分析HTTP HEADER中的内容就行了
[/Quote]
我可以确定是否为tcp,那么如何判断是否是http协议呢,最后http header中如何取出url呢
大侠,能否多说一些,万分感谢,困扰我好久了
Bullatus 2011-12-16
  • 打赏
  • 举报
回复
URL地址属于TCP下一层的协议的东西,以HTTP协议为例,先确定包为TCP协议,然后再分析其内容是否为HTTP协议,最后分析HTTP HEADER中的内容就行了

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧