📄 csdn_文档中心_关于独占端口.htm
字号:
color=#ffffff>标题</FONT></TD>
<TD><B> 关于独占端口</B> ghj1976(转贴)
</TD></TR>
<TR>
<TD align=middle height=5></TD>
<TD align=middle width=500></TD></TR>
<TR>
<TD align=middle bgColor=#003399><FONT color=#ffffff>关键字</FONT></TD>
<TD width=500> 关于独占端口</TD></TR>
<TR>
<TD align=middle height=5></TD>
<TD align=middle width=500></TD></TR>
<TR>
<TD align=middle bgColor=#003399 height=10><FONT
color=#ffffff>出处</FONT></TD>
<TD height=10> <A
href="http://go18.163.com/~lulin/InNET/ExclusivePort.html">http://go18.163.com/~lulin/InNET/ExclusivePort.html</A></TD></TR>
<TR>
<TD align=middle height=10></TD>
<TD height=10></TD></TR></TBODY></TABLE><!--文章说明信息结束//-->
<TABLE border=0 width=600>
<TBODY>
<TR>
<TD
align=left><BR>关于独占端口<BR>作者:Star<BR>2000.6.12<BR>欢迎转载,请注明出处.<BR><BR>--------------------------------------------------------------------------------<BR><BR>不知道各位有没有安装新的for
2K的PlatformSDK啊,如果安装后,不妨比较一下一些头文件和VS98原有的头文件的异同,会发现不少有趣的东东喔!有些内容其实MS早就在之前的平台上就提供了支持,只不过一直没有写入它的头文件里去,下面就是在WinSock2.h里发现的一个例子:
<BR><BR>在新版的WinSock2.h里,多了这么一段定义: <BR><BR>#define
SO_EXCLUSIVEADDRUSE ((int)(~SO_REUSEADDR)) /* disallow local address
reuse */
<BR><BR>从MS的注释也可以看出来了,这个东东是为了防止本地端口被重用的,我们知道,本来我们是可以向同一个端口绑定两个Socket的,只要使用上面被“反”掉的那个选项SO_REUSEADDR就可以了,想想看这会发生什么事?我们可以在一个程序打开POP3端口(服务器端缺省是110,客户端应该设置为随机选择)收信的同时,运行自己的程序,绑定自己的Socket到同样的端口上,这时侯你就可以在该程序收信的同时,窃听到信件的内容,包括账户密码!看起来非常简单,不是吗?可是现实中很多软件并没有采取任何有效的策略来对付这一手,比如国内著名的某电邮客户端软件F**Mail.
<BR><BR>那么我们该怎么防止这种情形在自己的程序运行当中出现?直接的想法是实时监控本机连接,看看都有些什么端口被绑定了,如果发现窃听程序存在立刻断开。听起来不错,可是真等你断开连接时可能密码已经泄漏了,要确保在密码传输前切断连接,需要大量的实时处理工作,就算抛开这些困难不谈,在Windows平台下去访问一大堆的注册表内容来确定目前活动的端口就有够烦了。还好,现在有了上面的这个socket选项,一切就变得简单了,请看如下演示程序:
<BR><BR><BR><BR><BR>//Test.cpp : Test exclusive with sockets<BR>//if
it's ok then written by Star, else i don't
know^_^<BR>//<BR><BR>#include <BR>#include <BR><BR>//if have no the
new PlatformSDK, then u need to add the<BR>//define statement to
your sourcecode, else remove it<BR>//<BR>#define SO_EXCLUSIVEADDRUSE
((int)(~SO_REUSEADDR))<BR><BR>const u_short EXCLUSIVE_PORT =
110;//or others<BR><BR>void main(int argc, char*
argv[])<BR>{<BR> SOCKET sock1,
sock2;<BR> int
ret;<BR> BOOL
val;<BR> WSADATA
ws;<BR> struct sockaddr_in
in;<BR><BR> //need WinSock
2.0!<BR> if (WSAStartup (2,
&ws))<BR> return;<BR><BR> if
(LOBYTE (ws.wVersion) -
2)<BR> return;<BR><BR> //make
two sockets<BR> sock1 = socket (AF_INET,
SOCK_STREAM, IPPROTO_TCP);<BR> sock2 = socket
(AF_INET, SOCK_STREAM,
IPPROTO_TCP);<BR><BR> val =
TRUE;<BR> ret = setsockopt (sock1,
SOL_SOCKET, SO_EXCLUSIVEADDRUSE, //set to
exclusive<BR>
(LPCSTR)&val, 4);<BR><BR> if
(ret)<BR> {<BR> //failed....<BR> //do
something to clear the
error....<BR> return;<BR> } <BR><BR> ZeroMemory
(&in, sizeof(in));<BR> in.sin_family =
AF_INET;<BR> in.sin_port = htons
(EXCLUSIVE_PORT);<BR> in.sin_addr.s_addr =
INADDR_ANY;<BR><BR> printf ("Now to bind the
first socket to port %d with SO_EXCLUSIVEADDRUSE\n",
EXCLUSIVE_PORT);<BR><BR> if (bind (sock1,
(const struct sockaddr*)&in,
sizeof(in)))<BR> {<BR> //failed...<BR> //do
something to clear the
error...<BR> closesocket
(sock1);<BR> return;<BR> }<BR><BR> printf
("The first socket has been bound to port %d\n",
EXCLUSIVE_PORT); <BR><BR> ret
= setsockopt (sock2, SOL_SOCKET, SO_REUSEADDR,//try to
reuse<BR>
(LPCSTR)&val, 4);<BR><BR> if
(ret)<BR> {<BR> //failed....<BR> //do
something to clear the
error....<BR> return;<BR> }<BR><BR> ZeroMemory
(&in, sizeof(in));<BR> in.sin_family =
AF_INET;<BR> in.sin_port = htons
(EXCLUSIVE_PORT);<BR> in.sin_addr.s_addr =
INADDR_ANY;<BR><BR> printf ("\nNow to bind
the second socket to port %d\n",
EXCLUSIVE_PORT);<BR><BR> if (bind (sock2,
(const struct sockaddr*)&in,
sizeof(in)))<BR> {<BR> if
(WSAEADDRINUSE == GetLastError
())<BR> printf
("bind failed, the SO_EXCLUSIVEADDRUSE take
effect!\n");<BR> else<BR> {<BR> //failed...<BR> //do
something to clear the
error...<BR> }<BR> } <BR> else<BR> printf
("What??? I see
nothing!!!\n");<BR><BR> closesocket
(sock1);<BR> closesocket
(sock2);<BR><BR> return;<BR>}
<BR><BR><BR><BR>上面的代码在我的PNT4SP6下编译运行通过,注意除了几个显眼处,很多地方都缺少应有的错误检测,需要用的朋友自己加上吧。9X下的情况我就不很清楚了,毕竟没用已经一年了,快忘光了:-)知道的朋友还请告诉我:-)我会补在后面的:-)
<BR><BR><BR>--------------------------------------------------------------------------------<BR><BR>灌水之作,敬请笑纳^_^
<BR><BR>关于Internet
Programming我也是新手,这篇东东在lu0兄的多次追问下写出来的,所以内容比较垃圾一些...现在我还记得lu0兄问我写了什么东西时的语气:“当时lu0兄的火气距离化成言辞冲出他的喉咙只差0.01公分,但是一天零一夜之后它将永远的憋在里面,因为我决定灌一篇水到这个版面上来。虽然本人生平灌过无数篇水,但是这篇,我认为是最纯净的。”<BR></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR>
<TABLE align=center bgColor=#006699 border=0 cellPadding=0 cellSpacing=0
width=770>
<TBODY>
<TR bgColor=#006699>
<TD align=middle bgColor=#006699 id=white><FONT
color=#ffffff>对该文的评论</FONT></TD>
<TD align=middle>
<SCRIPT src="CSDN_文档中心_关于独占端口.files/readnum.htm"></SCRIPT>
</TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1
width=770>
<TBODY>
<TR>
<TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16
hspace=1 src="CSDN_文档中心_关于独占端口.files/ico_pencil.gif" width=16>
</SPAN> JeffHe <I>(2000-8-28 12:21:40)</I> </TD></TR>
<TR>
<TD bgColor=#ffffff colSpan=3 width=532><BR>满分?????? chat* admire
ghj1976兄; chat* addoil all; <BR></TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1
width=770>
<TBODY>
<TR>
<TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16
hspace=1 src="CSDN_文档中心_关于独占端口.files/ico_pencil.gif" width=16>
</SPAN> ghj1976 <I>(2000-8-27 16:19:57)</I> </TD></TR>
<TR>
<TD bgColor=#ffffff colSpan=3 width=532><BR>晕倒,满分是100呀
<BR></TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1
width=770>
<TBODY>
<TR>
<TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16
hspace=1 src="CSDN_文档中心_关于独占端口.files/ico_pencil.gif" width=16>
</SPAN> sungw <I>(2000-8-24 23:02:51)</I> </TD></TR>
<TR>
<TD bgColor=#ffffff colSpan=3
width=532><BR>我给了满分10分.对所有程序员而言,bug是最难避免的,应该多多接收教训.
<BR></TD></TR></TBODY></TABLE><BR>
<DIV align=center>
<TABLE align=center bgColor=#cccccc border=0 cellPadding=2 cellSpacing=1
width=770>
<TBODY>
<TR>
<TH bgColor=#006699 id=white><FONT
color=#ffffff>我要评论</FONT></TH></TR></TBODY></TABLE></DIV>
<DIV align=center>
<TABLE border=0 width=770>
<TBODY>
<TR>
<TD>你没有登陆,无法发表评论。 请先<A
href="http://www.csdn.net/member/login.asp?from=/Develop/read_article.asp?id=430">登陆</A>
<A
href="http://www.csdn.net/expert/zc.asp">我要注册</A><BR></TD></TR></TBODY></TABLE></DIV><BR>
<HR noShade SIZE=1 width=770>
<TABLE border=0 cellPadding=0 cellSpacing=0 width=500>
<TBODY>
<TR align=middle>
<TD height=10 vAlign=bottom><A
href="http://www.csdn.net/intro/intro.asp?id=2">网站简介</A> - <A
href="http://www.csdn.net/intro/intro.asp?id=5">广告服务</A> - <A
href="http://www.csdn.net/map/map.shtm">网站地图</A> - <A
href="http://www.csdn.net/help/help.asp">帮助信息</A> - <A
href="http://www.csdn.net/intro/intro.asp?id=2">联系方式</A> - <A
href="http://www.csdn.net/english">English</A> </TD>
<TD align=middle rowSpan=3><A
href="http://www.hd315.gov.cn/beian/view.asp?bianhao=010202001032100010"><IMG
border=0 height=48 src="CSDN_文档中心_关于独占端口.files/biaoshi.gif"
width=40></A></TD></TR>
<TR align=middle>
<TD vAlign=top>百联美达美公司 版权所有 京ICP证020026号</TD></TR>
<TR align=middle>
<TD vAlign=top><FONT face=Verdana>Copyright © CSDN.net, Inc. All rights
reserved</FONT></TD></TR>
<TR>
<TD height=15></TD>
<TD></TD></TR></TBODY></TABLE></DIV>
<DIV></DIV><!--内容结束//--><!--结束//--></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -