2

TcpListenerを使用して着信通信をリッスンするアプリケーションを保守しています。次のコードは接続を開きます。

Dim listener As TcpListener
_listenFailed = False
Try
    listener = New TcpListener(System.Net.IPAddress.Parse(Me.Host), Me.Port)
    listener.Start()
Catch ex As Exception
    ' an error here means the settings are likely bogus
    _listenFailed = True
    Return
End Try

While Not _stoplistening
{
    ' Accept connection
}

私が抱えている問題は、別のコンピューターからファイルを送信すると、「ターゲットマシンがアクティブに拒否したため、接続できませんでした」というエラーが表示されることです。

ファイアウォールとウイルス対策を確認しましたが、ブロックはありませんでした。使用しました

netstat -a -n

ポートがアクティブでリッスンしていることを確認します。どちらのアプリケーションも、管理者モードでVisual Studioから実行されていますが、これによって違いが生じるわけではありません。受け入れ接続コードの最初の行にブレークポイントを設定していますが、実行されません。

アプリケーションを停止してTcpListenerを調べたところ、深く掘り下げた場合にいくつかのエラーが発生したことがわかりました。TcpListener.LocalEndpoint.IPEndPoint.IPAddress.Address.ErrorCodeで、エラー10045「OperationNotSupported」が発生しました。また、TcpListener.Socket.RemoteEndPoint.ErrorCodeで、エラー1057が発生しました。「ソケットが接続されていないため、データの送受信要求が許可されませんでした。また、(sendto呼び出しを使用してデータグラムソケットで送信する場合)アドレスが指定されませんでした。 。これらのエラーのいずれかが関連しているかどうかはわかりません。

この問題の原因について何か洞察があれば、または問題の根本を追跡するために実行できる手順があれば、私は感謝します。

4

1 に答える 1

1

これを変更してみてください:

listener = New TcpListener(System.Net.IPAddress.Parse(Me.Host), Me.Port)

これに:

listener = New TcpListener(System.Net.IPAddress.Any, Me.Port)

これにより、すべてのネットワークインターフェイスでリッスンできるようになります。


さらに、代わりにIPv6をターゲットにする場合は、IPv6Anyの代わりにを使用できます。Anyこの選択は、明らかにクライアント側で使用されるアドレスに影響を与えます。

于 2012-08-01T12:50:15.430 に答える