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番目のメッセージを送信すると、メッセージはポートに送信されますが、開発中の受信者に通知されないため、両方のプログラムがハングします。