Delphi下端口复用的实现

时间:2021-12-06 23:57:37
其实端口复用听起来很深奥的技术,其实很简单,简单得只需要一个函数就可以实现: 
  setsockopt( SOCKET s, int level, int optname, const char FAR *optval, int optlen );  
  参数: s Socket 的识别码,level选项设定的 level ,optname   选项名称 ,optval   选项的设定值 ,optlen   选项设定值的长度。 
  我只说一个参数,就是选项名称的其中一个选项SO_REUSEADDR,稍微会一点英语的和有一点计算机基础知识的都知道,这个选项后面的意思就是“重复使用地址” 
  我这里把实现端口复用的代码给出来,并给新手朋友们解释一下: 
var 
sobinyshuai : bool; 
myIP : string; 
PORT : integer; 
ServerSocket : TSocket; 
SockAddrIn: TSockAddrIn; 
WSAData: TWSAData; 
begin 
myIP:=’123.123.123.123’;{你自己的IP,为什么要这个,下面会说}  
sobinyshuai:=TRUE;   {这句话的意思是,sobiny帅,赋值是肯定的回答。呵呵,开个玩笑。} 
WSAStartUp(MakeWord(1, 1), WSAData); 
ServerSocket := WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, nil, 0, 0); {建造一个TCP的socket。} 
setsockopt(ServerSocket, SOL_SOCKET, SO_REUSEADDR, @sobinyshuai, sizeof(sobinyshuai)); 
{设定socket的状态,还是关键的这一句SO_REUSEADDR,允许端口重用} 
SockAddrIn.sin_family := AF_INET;         {设置这个连接的,我都还不晓得有另外的选项没,不过好象一直用这个。} 
SockAddrIn.sin_addr.s_addr:=inet_addr(myIP);   {设置这个连接的IP,这里可以是INADDR_ANY这个选项,不过要是是INADDR_ANY的话,所有的外部的连接都会是这个,不过要是你复用的80端口,设置INADDR_ANY的话,后果可想而知。当然你程序要是辨别数据包当然没问题} 
SockAddrIn.sin_port := htons(Port);     {设置这个连接的端口} 
Bind(ServerSocket, SockAddrIn, SizeOf(SockAddrIn));{设置ServerSocket的属性吧,应该这样理解} 
Listen(ServerSocket, 1); {设置监听,等待连接。在Accept前只接受一个连接} 
…… 
end; 
  端口复用就说完了,就这么简单,如果要加上什么功能的话,请在邪恶八进制里面搜索一下我发的“综合小工具”的源代码,把里面命令提示符,注册表模拟等你喜欢的东西复制过来就可以了。这个文章说白了还是必须要有一点点程序基础的朋友看的(各位超级新手的话,还是用别人的软件好些。)我全用的是API的函数,稍微变形一下就可以在C++下用。 
有3个PAS:Windows, Winsock2, Winsock; 
其实我想端口复用的问题并不是想写什么黑客软件,而是那天夸下海口说只需要利用一个webshell就实现各内网间的UDP通讯息,就必须涉及一下端口的复用,不然咋能行呢,如果有知道能UDP访问HTTP的朋友一定告诉我方法。呵呵,先谢谢。 
  现在又有一个想法提出来,希望高手来指点一下:就是偷袭serv-u的方法,在找不到目录,注册表不能导出用户的时候,偷袭serv-u.我是这么想的:因为在sendmessage给窗口可以发送消息,经过实验发现,serv-u的各个窗口都可以发送WM_SETTEXT改变文字,并且可以给执行权限那里发送点击的信息,再给应用那个按钮发送点击的信息,得到各个盘的控制权限,或者马上通过serv-u设置系统管理员帐号(如果serv-u有这个权限的话),不过问题就是,必须要管理员打开serv-u设置用户那一栏的时候,才能够行得通。测试的时候在本机GUEST权限下,这个程序是行得通的,直接又加了一个管理员,就是不知道在webshell下的执行效果会怎么样,如果有条件的朋友可以试试.