如何判断TCP连接中是否有其他消息

时间:2012-09-05 15:20:19

标签: vb.net sockets tcp

我有一个使用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) 

提前感谢你的帮助。

2 个答案:

答案 0 :(得分:1)

Socket.Select可用作轮询套接字以便于阅读的快速方法。传递0秒的超时,以及可读性列表中的有问题的套接字,它将立即检查并报告。

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

答案 1 :(得分:0)

继续阅读。如果没有任何内容,您将获得某种类型的流末尾指示,具体取决于您的API。