0

TCPを使用してファイルを受信するアプリを修正しようとしています。残念ながら、送信アプリケーションのソースコードがありません。私が抱えている問題は、最初のファイルが受信された後、2番目のファイルが送信側アプリケーションによって送信されますが、受信側アプリケーションによって取得されていないことです。

問題は、ファイルを受け取った後にソケットが閉じられていないことだと思います。それを閉じる必要があるメソッドがありますが、_socket.Connected = falseなので、何も実行されません。ただし、ポートを確認すると、ソケットを閉じた後でも、ポートはバインドされたままです。

    Private Sub CloseSocket(ByVal disconnect As Boolean)
        If Not (_socket Is Nothing) Then
            If (_socket.Connected = True) Then
                _socket.Shutdown(SocketShutdown.Both)
                If(disconnect) Then
                    _socket.Disconnect(True)
                End If
            End If
            _socket.Close()
            _socket = Nothing
        End If
    End Sub

私は多くのコードを含めていないことに気づきましたが、Listenメソッドは非常に大きく複雑です。洞察が得られる場合は、追加のコードを入手できます。どんな援助でも大歓迎です。

編集済み

ポートステータスの確認に使用されるコードは次のとおりです。

    Private Shared Function TcpIpGetPortStatus(ByVal port As Int32) As String

        Dim properties As NetworkInformation.IPGlobalProperties
        Dim listeners As Net.IPEndPoint()
        Dim local As Net.IPEndPoint
        Dim connections As NetworkInformation.TcpConnectionInformation()
        Dim t As NetworkInformation.TcpConnectionInformation
        Dim portStatus As String

        portStatus = "Disconnected"
        properties = NetworkInformation.IPGlobalProperties.GetIPGlobalProperties()
        listeners = properties.GetActiveTcpListeners()

        Try
            ' Cycle through all listening TCP connections and find the one that is associated with port.
            For Each local In listeners
                If (local.Port = port) Then
                    portStatus = "Connected"
                    Exit For
                End If
            Next local

            ' Port wasn't in the listening state so check if it is established.
            If (portStatus = "Disconnected") Then
                properties = NetworkInformation.IPGlobalProperties.GetIPGlobalProperties()
                connections = properties.GetActiveTcpConnections()

                ' Cycle through all active TCP connections and find the one that is associated with port.
                For Each t In connections
                    If (t.LocalEndPoint.Port = port) Then
                        Select Case t.State
                            Case NetworkInformation.TcpState.Established
                                portStatus = "Connected"
                                Exit For
                        End Select
                    End If
                Next t
            End If
        Catch ex As Exception
            ' Handle Exception...
        End Try

        Return portStatus

    End Function

この関数は、呼び出されると「接続済み」を返します。トレースしたところ、使用していたポートがまだバインドされていることがわかりました。繰り返しになりますが、すべての助けに感謝します。

添加

WireSharkを使用してデータをキャプチャし、2つの別々のシステム間でこれを実行しました。ソースコードがなく、統合しようとしているSenderとReceiverと、既存のコードと正しく通信できるようにコードを更新しているSenderとReceiverがあります。送信されるストリームは、どちらの場合も同じです(ACKの日時を除く)。既存の送信者からアップグレード中の受信者に2番目のメッセージを送信すると、メッセージはポートに送信されますが、開発中の受信者に通知されないため、両方のプログラムがハングします。

4

1 に答える 1

0

私に提供されたコードを注いだ後、私はついにそれが間違ったソケットを閉じて切断していることに気づきました。メッセージの受信に使用されたソケットでシャットダウンと切断を呼び出すのではなく、リスニングソケットで呼び出されました。

これに気づいたら、正しいソケットを閉じることができ、アプリケーションが動作し始めました。今、私はこれが基礎となるコードで引き起こしたすべての問題を調べて修正する必要があり、物事はうまくいくはずです。

回答してくださった皆様、ありがとうございました。あなたは私に正しい方向に考えさせました。

于 2012-09-04T14:25:23.963 に答える