0

我有一个使用 TCP 发送文件的发送应用程序。有时这些文件包含一条消息,有时文件可能包含多条消息。不幸的是,我无权访问发送应用程序的代码。

我正在编辑旧代码以接收这些消息。当发送一条消息时,我已经设法让旧版应用程序接受文件。但是,由于我在收到一条消息后断开了套接字,因此发件人给出了断开连接错误。

我写了一个小过程来帮助确定是否还有其他消息。如果它有效,我将把它合并到代码中,但结果好坏参半:

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

如果有另一条消息正在发送,这将检测到它。但是,如果文件只有一条消息,它会锁定接收,直到我发送另一个文件,然后它被接受。

有没有办法判断如果流为空,是否还有另一条消息未锁定?

我不会发布所有接受消息的代码,因为它是一个遗留的老鼠窝,但总体思路如下:

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 秒的超时,以及可读性列表中有问题的套接字,它会简单地检查并立即报告。

另外两个选项可能是Socket.ReceiveTimeout在您的套接字上设置,或者使用 使套接字非阻塞Socket.Blocking,这样您就可以(作为Receive调用的一部分)查明是否有传入数据。但是,这些在 .NET 中看起来有点不方便,因为它们会引发异常而不是简单地返回一个值,这可能会使代码更长一些。

于 2012-09-05T15:31:32.420 回答
0

继续阅读。如果什么都没有,您将获得某种流结束指示,具体取决于您的 API。

于 2012-09-05T23:48:13.713 回答