0

TCP を使用してファイルを送信する送信アプリケーションがあります。これらのファイルには 1 つのメッセージが含まれる場合もあれば、複数のメッセージが含まれる場合もあります。残念ながら、送信アプリケーションのコードにアクセスできません。

これらのメッセージを受信するために、レガシー コードの編集に取り組んでいます。単一のメッセージが送信されたときに、レガシーアプリケーションがファイルを受け入れるようにすることができました。ただし、メッセージを 1 つ受信した後でソケットを切断するため、Sender は切断エラーを返します。

別のメッセージがあるかどうかを判断するのに役立つ小さなプロセスを書きました。それが機能する場合は、コードに組み込むつもりでしたが、結果はまちまちでした:

Dim check(1) As Byte
If (handler.Receive(check, SocketFlags.Peek) > 0) Then
   Dim bytesRec As Integer
   ReDim bytes(1024)
   bytesRec = handler.Receive(bytes)
End If

送信されている別のメッセージがある場合、これはそれを検出します。ただし、ファイルにメッセージが 1 つしか含まれていない場合は、別のファイルを送信するまで受信がロックされ、それが受け入れられます。

ストリームが空の場合にロックされない保留中の別のメッセージがあるかどうかを確認する方法はありますか?

メッセージを受け入れるためのすべてのコードは投稿しませんが、これは従来のネズミの巣であるため、一般的な考え方は次のとおりです。

s2 = CType(ar.AsyncState, Socket)
handler = s2.EndAccept(ar)
bytes = New Byte(1024) {}
Dim bytesRec As Integer = handler.Receive(bytes)
' Send Ack/Nak.  
numAckBytesSent = handler.Send(myByte) 

よろしくお願いいたします。

4

2 に答える 2

1

Socket.Select読みやすさのためにソケットをポーリングする簡単な方法として使用できます。0秒のタイムアウトを渡し、可読性リストに問題のソケットを渡すと、チェックしてすぐに報告します。

他の2つのオプションはSocket.ReceiveTimeout、ソケットに設定するか、を使用してソケットを非ブロックにすることです。これにより、着信データがあるかどうかSocket.Blockingを(呼び出しの一部として)確認できます。Receiveただし、これらは単に値を返すのではなく例外をスローするため、.NETで行うには少し不便に見えます。これにより、コードが少し長くなる可能性があります。

于 2012-09-05T15:31:32.420 に答える
0

読み続けてください。何も残っていない場合は、API に応じて、何らかの種類のストリームの終了を示すメッセージが表示されます。

于 2012-09-05T23:48:13.713 に答える