什么是端口复用: 由于在winsock的实现中,对于服务器的绑定是能够多重绑定的,在肯定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,并且没有权限之分。这种多重绑定便称之为端口复用。 2、咱们如何实现Socket端口复用: 其实咱们要实现端口复用很简单,咱们只要使用SetSocketOption函数设置Socket选项就能够了。MSDN是这样解释的: Socket 选项肯定当前 Socket 的行为。对于具备 Boolean 数据类型的选项,指定非零值可启用该选项,指定零值可禁用该选项。对于具备整数数据类型的选项,指定适当的值。Socket 选项按照协议支持程度来分组。 咱们来看看这个函数是怎么用的:html
public void SetSocketOption ( SocketOptionLevel optionLevel, SocketOptionName optionName, int optionValue )
参数 optionLevel SocketOptionLevel 值之一。 optionName SocketOptionName 值之一。 optionValue 该选项的值。 以上参数你们能够去看看MSDN。我这里就很少讲了。 在这里咱们
optionLevel 参数传
SocketOptionLevel.Socket
;optionName参数传SocketOptionName.ReuseAddress;optionValue参传一个非零值,我传的是True,若是要禁用的话,就传False。 如: 编程
socket2.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
具体咱们看看下面的代码: 服务器
//咱们首先创建第一个Socket:
Socket socket1; IPEndPoint localEP1 = new IPEndPoint(IPAddress.Any, 20000); socket1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket1.Bind(localEP1); //再创建第二个Socket: Socket socket2; IPEndPoint localEP2 = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 20000); socket2 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket2.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); //请注意这一句。ReuseAddress选项设置为True将容许将套接字绑定到已在使用中的地址。 socket2.Bind(localEP2)
//请注意这一句。ReuseAddress选项设置为True将容许将套接字绑定到已在使用中的地址。 socket2.Bind(localEP); 这样Socket1和Socket2便绑定在同一个端口上了。 根据一条原则是谁的指定最明确则将包递交给谁,意思就是根据多个Socket所Bind的IP地址来肯定链接交给谁。如:SocketA Bind IPAddress.Any,SocketB Bind 192.168.0.5,那么客户端链接192.168.0.5的话,链接会被交给SocketB来处理,而链接其它的IP地址将交给SocketA来处理。 端口复用真正的用处主要在于服务器编程:当服务器须要重启时,常常会碰到端口还没有彻底关闭的状况,这时若是不设置端口复用,则没法完成绑定,由于端口还处于被别的套接口绑定的状态之中。socket
来源:https://www.cnblogs.com/viewcozy/p/4666137.html函数