1

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

我有这个代码:

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()在返回函数之前 我应该​​关闭套接字吗?

4

2 回答 2

2

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

现在,转到您的代码:您正在函数 CheckPort 内打开一个连接,因此当函数完成时,您将丢失对 s(打开的套接字)的任何引用。在 C 语言中,您会发生资源泄漏;在 Java 中,垃圾收集器会处理并关闭 Socket。我不知道它在 VB 中的情况,但我会在离开函数之前关闭该套接字。无论如何,这是一种健康的做法。

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

于 2013-11-01T20:51:34.830 回答
1

在连接之前检查端口与在打开文件之前验证文件是否存在一样有用:一点也不。

该文件可以在检查和打开之间被删除,并且您的套接字可能由于各种原因而关闭。

只需连接并写入它,当它不起作用时它会抛出一个适当的异常。

于 2013-11-01T14:55:25.240 回答