关闭套接字?

时间:2013-11-01 14:52:54

标签: vb.net sockets network-programming

我有一个应用程序需要通过特定端口将数据流式传输到服务器。当应用程序启动时,它会执行许多检查,网络连接,可访问的主机等。我希望它也检查端口以确保它能够接收数据。

我有这段代码:

Private Function CheckPort(ByVal Host As String) As Boolean

  Dim IPs() As IPAddress = Dns.GetHostAddresses(Host)
  Dim s As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)

  s.Connect(IPs(0), <port # removed>)

  If s.Poll(-1, SelectMode.SelectWrite) Then
    Return True
  End If

  Return False

End Function

代码运行良好,但我担心通过执行检查我可能会无意中阻止来自应用程序的后续消息到达端口。执行此检查是否会干扰我要发送给主机的实际数据?在返回函数之前,我应该用s.close()关闭套接字吗?

2 个答案:

答案 0 :(得分:2)

我主要同意CodeCaster的回应。 如果您说服务器有问题,那么在检查端口连接几分钟后,服务器连接断开甚至关闭也很可能。 如果你仍然希望这样做是为了降低让用户写一些以后无法发送的消息的风险,那么这将是一个很好的方法。另一种方法是,您可以将数据保存为本地草案或其他位置,以便以后在服务器可用时发送。

现在,转到您的代码: 您正在函数CheckPort中打开一个连接,所以当函数完成时,您将失去对s(打开套接字)的任何引用。在C中,你会有资源泄漏;在Java中,垃圾收集器将处理Socket并关闭它。我不知道在VB中是怎么回事,但在离开函数之前我会关闭那个套接字。无论如何,这是一种健康的做法。

此外,当您准备好发送数据时,如果您丢失了对打开套接字的引用或关闭套接字,则无法在同一连接上执行此操作(除非VB有任何技巧)不知道)。您必须打开一个新连接才能发送数据。别担心,即使你之前做过检查,你也可以这样做。服务器将其视为一个不同的连接,可能来自不同的源端口(如果之前关闭连接,则可能是相同的,这取决于操作系统)。

答案 1 :(得分:1)

在连接之前检查端口与在打开之前验证文件存在一样有用:完全没有。

可以在检查和打开之间删除文件,并且可以出于各种原因关闭套接字。

只要连接并写入它,它就会在它无法工作时抛出适当的异常。