Asp.net 如何在IIS中解除套接字服务器的绑定

Asp.net 如何在IIS中解除套接字服务器的绑定,asp.net,.net,sockets,iis,Asp.net,.net,Sockets,Iis,我有一个IIS 6.1应用程序,试图在其中维护套接字服务器,但无法释放端口: 在Global.asax.csApplication\u Start中,我启动一个线程ProgramConnectionServerThread,其中我有: int programPort = ServerConfiguration.Instance.ProgramConnectionPort; ServerConfiguration.Instance.ProgramConnectionSocket = new Soc

我有一个IIS 6.1应用程序,试图在其中维护套接字服务器,但无法释放端口:

在Global.asax.cs
Application\u Start
中,我启动一个线程
ProgramConnectionServerThread
,其中我有:

int programPort = ServerConfiguration.Instance.ProgramConnectionPort;
ServerConfiguration.Instance.ProgramConnectionSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
Socket listener = ServerConfiguration.Instance.ProgramConnectionSocket;
IPEndPoint localEndPoint = new IPEndPoint(Dns.Resolve(Dns.GetHostName()).AddressList[0], programPort);

listener.Bind(localEndPoint);
listener.Listen(10);
while (true)
{
    Socket handler = listener.Accept();
    // action
}
在Global.asax.cs
Dispose

try
{
    if (ServerConfiguration.Instance.ProgramConnectionServerThread != null)
    {
        ServerConfiguration.Instance.ProgramConnectionServerThread.Abort();
    }
}
catch (Exception eeg2)
{
// Log
}
try
{
    LingerOption lo = new LingerOption(false, 0);
    ServerConfiguration.Instance.ProgramConnectionSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Linger, lo);
    ServerConfiguration.Instance.ProgramConnectionSocket.Shutdown(SocketShutdown.Both);
    ServerConfiguration.Instance.ProgramConnectionSocket.Close(); // this is Line 133
}
catch (Exception eeg2)
{
// Log
}
这种方法似乎不起作用。在日志记录中,我在调用
Close()
时收到以下错误消息:

A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied
   at System.Net.Sockets.Socket.Shutdown(SocketShutdown how)
   at Contoso.Global.Dispose() in E:\Contoso\Global.asax.cs:line 133
如果我在IIS中重新启动网站,则该端口不是免费的!我在绑定时收到以下消息:

System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted

如何释放此端口,以便在随后重新启动应用程序时可以绑定新的侦听器?

我看到行号有时会减少一个。堆栈跟踪清楚地告诉您它来自
Shutdown

侦听套接字从未连接。你为什么要关掉它?确保您了解关机的作用


将ASP.NET应用程序用作套接字服务器很难正确使用。正如您可能已经观察到的,工作进程生命周期可能重叠。然而,这将是一个新问题。

是的,所以我试图关闭它的原因是因为错误,我说“每个套接字地址……通常只允许使用一次”。第二次尝试将套接字服务器绑定到该地址时,它失败了,我想这一定是因为旧套接字在调用
Accept()
时仍然被阻塞。我尝试所有这些东西的全部原因是释放该端口,以便我可以再次绑定到它。你能告诉我怎么做吗?如果有一个叫做“Unbind”的方法,我会叫它。Close就是那个方法。正如我所说,多个工作进程可以同时存在。试着重试几秒钟,希望到那时老工人已经被关闭。你在反对这里的制度。您不应该在IIS中承载同时最多只能有一个实例的内容。你当然可以使它工作,但期待麻烦。另外,尽量不要使用套接字。好吧,那么我在其他帖子中遵循的一些建议似乎是不正确的。我所做的是(1)不丢弃线程(2)像以前一样保留LingerOption(3)不断开服务器套接字(4)关闭套接字(5)捕获在Accept()方法中阻塞线程时将抛出的SocketException。那么它似乎起作用了。是的,没错。除了linger选项对侦听套接字不起任何作用。让我指出,网络上的大多数套接字建议都是有问题的。几乎没有人能很好地理解套接字。这就是为什么只有在没有其他选择的情况下才应该使用它们。