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 に私が持っていないトリックがない限り)知る)。データを送信するには、新しい接続を開く必要があります。以前にチェックを行った場合でも、ご安心ください。サーバーは、おそらく別のソースポートからの別の接続としてそれを認識します(または、OSによっては、以前に接続を閉じた場合は同じである可能性があります)。

于 2013-11-01T20:51:34.830 に答える
1

ポートに接続する前にポートをチェックすることは、ファイルを開く前にファイルの存在を確認するのと同じくらい役に立ちますが、まったく役に立ちません。

ファイルはチェックとオープンの間に削除される可能性があり、ソケットはさまざまな理由で閉じられる可能性があります。

接続して書き込むだけで、機能しない場合に適切な例外がスローされます。

于 2013-11-01T14:55:25.240 に答える