楼主的需求用端口复用可以实现,转贴一个文章:
端口复用听起来很深奥的技术,其实很简单,简单得只需要一个函数就可以实现:
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;