您的位置:首页 > 理论基础 > 计算机网络

最近在编一个通过代理实现网页模拟点击和POST的Internet程序

2005-08-17 23:01 656 查看
初步的思想是想用socket来实现网页的模拟点击和表单的POST
至于有什么用这个就很难讲了,大家可以做一个基于WEB的邮箱客户端,也可以做一个半自动的申请器,当然也可以用到别的地方去,但是现在我现在实在没有时间来完成它,原因很简单,因为我今年大四,接下来要参加全国软件水平的软件设计师考试,郁闷,上次下午过了,上午还差一点。还要完成一个毕业设计,是一个基于NDIS的网络数据监测控制软件,这个头有点大了,还没着手,准备就快要开始了,自己给自己一个最后的期限就是明天开始。还有CET-6和教师资格证,晕啊,时间不够了!
现面来说点自己这几天编程的经验。在CSDN中看到有位高人说这个网络程序可以用很多方法来做,我也试过用WININET,但是感觉以后自己来驾驭它会很困难,越是底层的东西就越好控制,当然还有很多可以用的技术,比如WINHTTP,或者COM,但是我没这么好的基础,慢慢学嘛,所以我就采用了socket来实现。有经验的程序员肯定不会有很大的问题,不过我也还是初学者,所以当然走了很多很多的弯路,用了很多很多的时间来整理各种各样的资料。呵呵,有点跑题了,不说这个了..
我发现使用网络数据截获软件可以很方便的观察数据包的收发过程,连一个CONNECT函数都有相应的状态数据包,具体研究如下:

首先,我建立一个SOCKET,然后,使用一个CONNECT,连接到代理服务器及其端口上,当然前提是你的代理服务器支持CONNECT(大部分HTTP代理可以支持CONNECT),成功后服务器返回一个确认信号,这个信号中包含了第二次握手信息,请求我的机器的确认,于是我的机器就给它一个确认的信号。这样两次握手完成,建立了一个基于TCP的连接。

看图:

step1 Source IP =====> Destination IP SYN: 1 (请求连接标志)
step2 Source IP <===== Destination IP ACK: 1 (连接确认标志) SYN: 1 (再次请求连接标志)
step3 Source IP =====> Destination IP ACK: 1 (连接确认标志)

有连接就好了,这样就可以想代理服务器IP发送数据包了,不熟悉HTTP协议的朋友请去看看相关的RFC1945,英文不好的也可以去看中文的RFC,给出链接如下:点击http://www.leepig.com/rfc/RFC1945.txt。
具体的我不多说了,来看看怎么构造HTTP头文件吧。现面给出一个例子。

Version: HTTP/1.0
Method: GET
URI: http://www.163.com/
Accept: */*
Accept-Language: zh-cn
Cookie: ******
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MyIE2; Maxthon)
Host: www.163.com
Proxy-Connection: Keep-Alive

使用建立好的SOCKET函数发送这个头文件这样就可以向代理服务器请求www.163.com的页面了。但是在程序中怎么发送呢?看了RFC文档的就没问题了,如果还不明白,那我只好说一点了,不说具体的方法,说点实质的东西。

发送括号里的内容给代理服务器 (GET http://www.163.com/ HTTP/1.0 /r/nAccept: */*/r/nAccept-Language: zh-cn/r/nCookie: ******/r/nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MyIE2; Maxthon)/r/nHost: www.163.com/r/nProxy-Connection: Keep-Alive/r/n/r/n)

这里有特别注意的几点,也是我的失败的经验:******就是这个网站建立的COOKIE,大家可以到系统盘符下面去查看,当然也可以有别的办法获得。网站请求的URL必须要以“/”结尾,不然得不到这个网址得HTML代码,特别注意,换行符使用“/r/n”,最后一定要有两个“/r/n”,不然也会发生错误的。

如果没有别的问题这样就可以了,应该能用RECEIVE函数来获得返回的HTTP头文件和HTML代码了,不过这样不是很完美,如果你要最完美的获得所有的内容,就要完全的模拟浏览器来获得所有的图片的连接,那么呵呵就要这么做,分析获得的HTML代码,在获得的代码中如果有超链接标志的,那么就把这个超链接获得出来,再建立一个SOCKET来发送一个类似于上面描述的HTTP头到代理服务器,就这样每碰到一个就发送一个SESSION,这才是真正的模拟,呵呵。
可惜现在很多人都不肯说,大家忙嘛,没办法,可是这个不是理由,关键是你想不想帮别人,我会不断发我的经验的,要相关资料的朋友请发送EMAIL到rikzjy@gmail.com,我很乐意帮助你们做你们的朋友,最后祝大家愉快!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐