|
关于独占端口(1)
关于独占端口 作者:Star 2000.6.12 欢迎转载,请注明出处.
--------------------------------------------------------------------------------
不知道各位有没有安装新的for 2K的PlatformSDK啊,如果安装后,不妨比较一下一些头文件和VS98原有的头文件的异同,会发现不少有趣的东东喔!有些内容其实MS早就在之前的平台上就提供了支持,只不过一直没有写入它的头文件里去,下面就是在WinSock2.h里发现的一个例子:
在新版的WinSock2.h里,多了这么一段定义:
#define SO_EXCLUSIVEADDRUSE ((int)(~SO_REUSEADDR)) /* disallow local address reuse */
从MS的注释也可以看出来了,这个东东是为了防止本地端口被重用的,我们知道,本来我们是可以向同一个端口绑定两个Socket的,只要使用上面被“反”掉的那个选项SO_REUSEADDR就可以了,想想看这会发生什么事?我们可以在一个程序打开POP3端口(服务器端缺省是110,客户端应该设置为随机选择)收信的同时,运行自己的程序,绑定自己的Socket到同样的端口上,这时侯你就可以在该程序收信的同时,窃听到信件的内容,包括账户密码!看起来非常简单,不是吗?可是现实中很多软件并没有采取任何有效的策略来对付这一手,比如国内著名的某电邮客户端软件F**Mail.
那么我们该怎么防止这种情形在自己的程序运行当中出现?直接的想法是实时监控本机连接,看看都有些什么端口被绑定了,如果发现窃听程序存在立刻断开。听起来不错,可是真等你断开连接时可能密码已经泄漏了,要确保在密码传输前切断连接,需要大量的实时处理工作,就算抛开这些困难不谈,在Windows平台下去访问一大堆的注册表内容来确定目前活动的端口就有够烦了。还好,现在有了上面的这个socket选项,一切就变得简单了,请看如下演示程序:
//Test.cpp : Test exclusive with sockets //if it's ok then written by Star, else i don't know^_^ //
#include #include
//if have no the new PlatformSDK, then u need to add the //define statement to your sourcecode, else remove it // #define SO_EXCLUSIVEADDRUSE ((int)(~SO_REUSEADDR))
const u_short EXCLUSIVE_PORT = 110;//or others
void main(int argc, char* argv[]) { SOCKET sock1, sock2; int ret; BOOL val; WSADATA ws; strUCt sockaddr_in in;
//need WinSock 2.0! if (WSAStartup (2, &ws)) return;
|