如何在程序中“解绑”一个socket?

4

1) 直到进程结束,套接字似乎不会从LocalEndPoint解绑。
2) 我尝试了其他问题中提供的解决方案,并尝试等待一分钟,但都没有成功。
3) 目前我已经尝试了以下方法来摆脱套接字及其连接:

public static void killUser(User victim)  
    {  
        LingerOption lo = new LingerOption(false, 0);  
victim.connectedSocket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.Linger,     lo);  
        victim.connectedSocket.Shutdown(SocketShutdown.Both);  
        victim.connectedSocket.Disconnect(true);  
        victim.connectedSocket.Close();  
        clients.RemoveAt(victim.ID);  
    }  

4) 在进行了一些谷歌搜索后,我似乎无法解绑定端口,因此如果我有足够多的连接客户端,最终将会用完可以监听的端口。

1个回答

10

我怀疑你把已连接客户端的套接字和服务器套接字弄混了。

你的服务器套接字是在特定端口上监听传入连接的那个。你在该函数中关闭的套接字是你与一个(可能有多个)远程连接之间的通道。

要“解除端口绑定”,您需要关闭/停止 服务器 套接字。

更新以消除一些混淆

您应该拥有一个“服务器”套接字,对其调用了.Bind(EndPoint)方法,然后调用了.Listen()方法。这是您想要关闭/停止以“解除绑定”并释放端口供以后使用的套接字。

然后,当您的“服务器”套接字接受新连接时,您会获得多个“客户端”套接字的引用。所有这些都可以绑定到同一端口而不会出问题。要关闭其中一个连接并断开客户端,请执行您现在正在执行的操作。实际上,您可以将该方法简化为:

  • 关闭
  • 从列表中删除

断开连接和其他内容都是不必要的。


  1. 我从不启动第二个侦听套接字。我只会启动潜在的多个套接字,它们只是坐在那里并开始接收/发送。
  2. 只是因为我想重用已经断开连接的端口。
  3. 顺便说一下,这是一个控制台应用程序,所以它似乎会静默崩溃...
  4. 本质上,我的问题是:为什么我的程序会崩溃?我已经释放了端口(我认为),如此:这个线程。
- ryan1894
如果您没有启动第二个服务器套接字,那么任何崩溃几乎肯定与“重用端口”无关。我的建议是找到导致崩溃的代码行,并从那里开始解决问题。只要在客户端断开连接时关闭套接字(使用client.connectedSocket.Close()),并确保在完成所有操作后调用server socket的.Close(),您就不必担心客户端占用资源的问题。 - Sapph
1
哇等一下,我刚刚看到你上面的编辑。当客户端连接在5900端口时,为什么要将它们重新连接到5901?这是不必要的,请让它们保持在5900上。 - Sapph
1
嗯,我重新阅读了我的代码,导致它崩溃的那一行是 tempSock.Bind(IPEP); 这是因为我想要重用一个端口。我想知道是否可以重用端口 - 应该可以(我猜)... “这是不必要的,只需将它们保留在5900上”我想将5900作为最初连接的端口,其余端口用于实际数据传输... 如果我不重新分配所有客户端的端口,则客户端将不得不手动检查哪些端口正在使用或未使用等。 - ryan1894
2
你只需要调用一次Bind,在你的服务器套接字(也是你用来调用Listen的那个)上调用它。一旦你的客户端(尽可能多地连接)在5900上连接,就没有必要再连接它们了。你可以同时将所有客户端放在5900上。如果你想要重新连接,你就必须设置额外的服务器套接字,在其他端口上监听。 - Sapph
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接