网络编程基础.docx
《网络编程基础.docx》由会员分享,可在线阅读,更多相关《网络编程基础.docx(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、网络编程基础一、关于语言、编译器及系统 我们知道,在计算机里面进行程序设计至少需要掌握一种程序设计语言。常见的程序设计语言包括C/C+、ASM、BASIC、Delphi、Perl等,你随便根据兴趣去学习一种语言都可以实现程序设计这个目的,这些语言并没有谁比谁更好的问题(这是一个理解问题,实际上一些语言应该说比一些语言更先进,比如可以说C+比C更先进,但不能说谁比谁好,每一种语言都是优秀思想的结晶,我这样理解),只是它们的侧重点不同。比如,ASM、C比其他语言更接近系统的底层,使得它们适合做系统方面的程序设计、而用BASIC可以更快的设计应用程序等。作为网络程序设计我更喜欢C/C+语言,它有目标
2、程序较小、运行速度快等优点,还包括习惯问题(所以,下面的描述中如果不特别说明,都以C/C+为例),当然选择什么语言进行程序设计是见仁见智的问题(你决定选择C/C+了吗?如果决定了,下面的的描述会更有针对性)。 我们选择好一种语言后,并编写好了程序代码,这么样才能让系统运行我们的程序呢?这就需要编译器了,编译器的作用就是把类似下面的源代码编译成系统可以识别并执行的代码: include intmain() printf(“helloword.rn”); return0; 所有的语言都有自己的编译器,C语言的编译器有TC、BC等,C+语言的编译器有VisualC+、C+Builder等。C和C+语
3、言的关系是很密切的,C+语言是C语言的超集,而因为向下的兼容性,所以,如果你写的C源代码符合ANSIC标准,那么其在C和C+的编译器里面都可以编译,相反,C+的源代码只能在C+的编译器中编译。 那么编译器除了可以把源代码编译成可执行代码还有其他的作用吗?答案是有,一般的情况下,编译器都提供一个集成的环境给设计这编写、编译程序,还包括一系列的函数库,比如上面例子中的prinrf就是stdlib.h提供的一个库函数。在涉及到网络程序设计中,常听到Winsock、Winapi等说法,而这些也是编译器提供的一套库函数,而这些库函数有一些编译器是不提供的,如TC、BC等,所以这些编译器不可以你作为网络程
4、序设计的编译器,当然,这些编译器不适合作为网络程序设计的编译器还有其他重要的原因。 常看见下面这样的问题: 这个程序我用TC怎么编译不了? 可以不可以用TC编写网络程序? 现在告诉你,不可以,除了上面的原因,更重要的原因是我们现在程序所运行的平台是Windows(当然有其他的,但情况是类似的),而Winsock、Winapi本身是由系统(Windows)提供给我们的接口,编译器是帮助我们使用这些接口的桥梁,而TC等编译器本身没有这个功能,所以不能使用它们来帮助我们编写网络程序。还有,TC等编译器是为DOS等16位操作系统设计的,已经不能够适用我们现在32位的操作系统环境了。所以,我推荐Visu
5、alC+、C+Builder或其他32位C+编译器。 VisualC+、C+Builder或其他的32位C+编译器谁更好呢?这也是见仁见智的问题,常见到有些报道说现在的C+Builder比VisualC+要好,这两个编译器不断的在竞争、攀比。我选择VisualC+,并不是说它比C+Builder好,而是因为它编写的可执行代码(目标文件)比较小,这也不是说它比C+Builder好,而是因为它是Microsoft出品的,而Windows也是Microsoft出品的,在Windows的发行版本中本身就包含了很多运行库,这样VisualC+的目标代码比较小。 二、关于代理 一般做坏事的时候都害怕对方发
6、现自己的真实IP,怎么办?用代理是简单的办法。下面描述如何编程使用各种代理。 1、HTTP代理 HTTP代理可以把我们的HTTP请求通过HTTP代理服务器转发到我们要访问的HTTP服务器,再把结果返回给我们,以达到代理的目的。但其功能单一,只能实现HTTP的代理,具体可以查看RFC2068、2616等相关RFC文档。正常情况下,我们请求HTTP服务是这样的:首先和目的服务器的HTTP服务端口建立TCP连接,然后做类似“GET/index.htmlHTTP/1.0”的请求,HTTP服务器返回结果。当通过HTTP代理的时候是这样工作的:首先和HTTP代理服务器的服务端口建立TCP连接,然后做类似“
7、GEThttp:/目标服务器地址/index.htmHTTP/1.0”的请求,代理服务器对你的目标服务器做请求后返回结果给你。 相关的代码在网上很容易可以找到,这里就不列举了。 2、socks代理 socks是一个简单灵活的协议框架,包括4和5两个版本,sock5是由IETF核准的基于TCP/IP协议的基本应用程序代理协议,socks由两个部分组成,服务端和客户端。具体信息可以查看RFC1928相关文档,在网上也可以搜索到许多基于socks5的开源项目,对照RFC文档,你可以了解这个协议的使用。 以下信息来直接摘自互联网 sock5代理客户端的工作程序是: 1.客户端向代理方服务器发出请求信息
8、。 2.代理方服务器应答 3.客户端接到应答后发送向代理方服务器发送目的ip和端口 4.代理方服务器与目的连接 5.代理方服务器将客户端发出的信息传到目的方,将目的方发出的信息传到客户端。代理完成。 由于网上的信息传输基本上都是运用tcp或udp进行的,所以使用socks5代理可以办到网上所能办到的一切,而且不用担心目的方会查到你的ip,既安全又方便。 如何用代理TCP协议: 1.向服务器的1080端口建立tcp连接。 2.向服务器发送050100(此为16进制码,以下同) 3.如果接到0500则是可以代理 4.发送05010001+目的地址(4字节)+目的端口(2字节),目的地址和端口都是1
9、6进制码(不是字符串)。例202.103.190.27-7201则发送的信息为:05010001CA67BE1B1C21(CA=20267=103BE=1901B=271C21=7201) 5.接受服务器返回的自身地址和端口,连接完成 6.以后操作和直接与目的方进行TCP连接相同。 如何用代理UDP连接 1.向服务器的1080端口建立udp连接 2.向服务器发送050100 3.如果接到0500则是可以代理 4.发送0503000100000000+本地UDP端口(2字节) 5.服务器返回05000001+服务器地址+端口 6.需要申请方发送00000001+目的地址IP(4字节)+目的端口+
10、所要发送的信息 7.当有数据报返回时向需要代理方发出00000001+来源地址IP(4字节)+来源端口+接受的信息 注:此为不需要密码的代理协议,只是socks5的一部分,完整协议请看RFC1928 下面为一个实例程序: 这个例子可以在这里找到(.;b=9&user=baidu) 在网络程序设计过程中,我们经常要与各种类型的代理服务器打交道,比如在企业内部网通过代理去访问Internet网上的服务器等等,一般代理服务器支持几种常见的代理协议标准,如Socks4,Socks5,Http代理,其中Socks5需要用户验证,代理相对复杂。我在查阅RFC文档和相关资料后,特总结一些TCP协议穿透代理服
11、务器的程序片断,希望对大家有所帮助。 /使用到的结构 structsock4req1 charVN; charCD; unsignedshortPort; unsignedlongIPAddr; charother1; ; structsock4ans1 charVN; charCD; ; structsock5req1 charVer; charnMethods; charMethods255; ; structsock5ans1 charVer; charMethod; ; structsock5req2 charVer; charCmd; charRsv; charAtyp; charo
12、ther1; ; structsock5ans2 charVer; charRep; charRsv; charAtyp; charother1; ; structauthreq charVer; charUlen; charName255; charPLen; charPass255; ; structauthans charVer; charStatus; ; /通过Socks4方式代理 if(!ClientSock.Connect(g_ProxyInfo.m_strProxyIP,g_ProxyInfo.m_nProxyPort) m_sError=_T(不能连接到代理服务器!); Cl
13、ientSock.Close(); returnFALSE; charbuff100; memset(buff,0,100); structsock4req1*m_proxyreq; m_proxyreq=(structsock4req1*)buff; m_proxyreq-VN=4; m_proxyreq-CD=1; m_proxyreq-Port=ntohs(GetPort(); m_proxyreq-IPAddr=inet_addr(GetServerHostName(); ClientSock.Send(buff,9); structsock4ans1*m_proxyans; m_pr
14、oxyans=(structsock4ans1*)buff; memset(buff,0,100); ClientSock.Receive(buff,100); if(m_proxyans-VN!=0|m_proxyans-CD!=90) m_sError=_T(通过代理连接主站不成功!); ClientSock.Close(); returnFALSE; /通过Socks5方式代理 if(!ClientSock.Connect(g_ProxyInfo.m_strProxyIP,g_ProxyInfo.m_nProxyPort) m_sError=_T(不能连接到代理服务器!); Client
15、Sock.Close(); returnFALSE; charbuff600; structsock5req1*m_proxyreq1; m_proxyreq1=(structsock5req1*)buff; m_proxyreq1-Ver=5; m_proxyreq1-nMethods=2; m_proxyreq1-Methods0=0; m_proxyreq1-Methods1=2; ClientSock.Send(buff,4); structsock5ans1*m_proxyans1; m_proxyans1=(structsock5ans1*)buff; memset(buff,0,
16、600); ClientSock.Receive(buff,600); if(m_proxyans1-Ver!=5|(m_proxyans1-Method!=0&m_proxyans1-Method!=2) m_sError=_T(通过代理连接主站不成功!); ClientSock.Close(); returnFALSE; if(m_proxyans1-Method=2) intnUserLen=strlen(g_ProxyInfo.m_strProxyUser); intnPassLen=strlen(g_ProxyInfo.m_strProxyPass); structauthreq*m
17、_authreq; m_authreq=(structauthreq*)buff; m_authreq-Ver=1; m_authreq-Ulen=nUserLen; strcpy(m_authreq-Name,g_ProxyInfo.m_strProxyUser); m_authreq-PLen=nPassLen; strcpy(m_authreq-Pass,g_ProxyInfo.m_strProxyPass); ClientSock.Send(buff,513); structauthans*m_authans; m_authans=(structauthans*)buff; memse
18、t(buff,0,600); ClientSock.Receive(buff,600); if(m_authans-Ver!=1|m_authans-Status!=0) m_sError=_T(代理服务器用户验证不成功!); ClientSock.Close(); returnFALSE; structsock5req2*m_proxyreq2; m_proxyreq2=(structsock5req2*)buff; m_proxyreq2-Ver=5; m_proxyreq2-Cmd=1; m_proxyreq2-Rsv=0; m_proxyreq2-Atyp=1; unsignedlon
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 编程 基础
限制150内