none
关于设置Socket.ExclusiveAddressUse 属性 RRS feed

  • 问题

  • msdn的解释是:获取或设置一个 Boolean 值,该值指定 TcpListener 是否只允许一个基础套接字来侦听特定端口。

    我以为是两个进程可以监听同一端口,但是在两个进程里运行如下代码:

    TcpListener listener = new TcpListener(IPAddress.Any, 8888);
    listener.ExclusiveAddressUse = false;
    listener.Start();//异常

    第二个进程会抛异常:通常每个套接字地址(协议/网络地址/端口)只允许使用一次。

    不知道这个属性该怎么用?

    2012年8月21日 5:22

答案

  • 查win32 api解决了:

    还要设置SO_REUSEADDR,即:

    Socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);

    2012年8月23日 3:43

全部回复

  • 可以参考 MSDN, 需要使用 Socket.Bind 方法。

    http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.exclusiveaddressuse.aspx

    If ExclusiveAddressUse is false, multiple sockets can use the Bind method to bind to a specific port; however only one of the sockets can perform operations on the network traffic sent to the port. If more than one socket attempts to use the Bind(EndPoint) method to bind to a particular port, then the one with the more specific IP address will handle the network traffic sent to that port.

    或者http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.exclusiveaddressuse.aspx

    ExclusiveAddressUse 为 false,则多个套接字可以使用 Bind 方法绑定到特定端口;不过,只有其中的一个套接字可以对发送到该端口的网络流量执行操作。 Bind(EndPoint) 方法绑定到特定端口,则将由具有最为具体的 IP 地址的套接字来处理发送到该端口的网络流量。


    学习学习....

    2012年8月21日 7:16
  • 但是,我在两个进程里使用Bind方法,仍然说套接字只能使用一次:

    Socket s1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    s1.ExclusiveAddressUse = false;
    s1.Bind(new IPEndPoint(Dns.GetHostAddresses(Dns.GetHostName())[0], 8888));   

    (系统xpsp2)

    还是不理解这个属性有何作用

    2012年8月22日 8:15
  • 你好,

    不要用 new IPEndPoint

    而是将它定义成一个公共变量

    IPEndPoint ipend = new IPEndPoint(Dns.GetHostAddresses(Dns.GetHostName())[0], 8888);
    public void Myfunccc()
    {
    Socket s1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    s1.ExclusiveAddressUse = false;
    s1.Bind(ipend);
    }

    有问题,请继续跟贴。谢谢。


    Mike Feng
    MSDN Community Support | Feedback to us
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年8月22日 13:08
    版主
  • 查win32 api解决了:

    还要设置SO_REUSEADDR,即:

    Socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);

    2012年8月23日 3:43