我有一个使用TCP发送文件的发送应用程序。有时这些文件包含一条消息,有时该文件可能包含多条消息。不幸的是,我无法访问发送应用程序的代码。
我正在编辑遗留代码以接收这些消息。我已经设法让遗留应用程序在发送单个消息时接受文件。但是,由于我在收到单个消息后断开了套接字,因此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
如果发送了另一条消息,则会检测到该消息。但是,如果文件只有一条消息,它会锁定接收,直到我发送另一个文件,然后它被接受。
有没有办法判断是否有另一条待处理的消息如果流为空则不会锁定?
我不会发布所有接受邮件的代码,因为它是传统的老鼠窝,但总体思路如下:
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)
提前感谢你的帮助。
答案 0 :(得分:1)
Socket.Select
可用作轮询套接字以便于阅读的快速方法。传递0秒的超时,以及可读性列表中的有问题的套接字,它将立即检查并报告。
其他两个选项可能是在套接字上设置Socket.ReceiveTimeout
,或使用Socket.Blocking
使套接字无阻塞,以便您可以找到(作为Receive
调用的一部分)是否有传入数据。但是,这些在.NET中看起来有点不方便,因为它们抛出异常而不是简单地返回一个值,这可能会使代码更长一些。
答案 1 :(得分:0)
继续阅读。如果没有任何内容,您将获得某种类型的流末尾指示,具体取决于您的API。