2012-09-05 122 views
0

我有一个使用TCP发送文件的发送应用程序。有时这些文件包含一条消息,而其他时间该文件可能包含多条消息。不幸的是,我无法访问发送应用程序的代码。如何判断另一条消息是否在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) 

预先感谢您的任何援助。

回答

1

Socket.Select可以用作轮询套接字以提高可读性的快速方法。在可读性列表中传入一个0秒的超时值和有问题的套接字,它会立即检查并报告回来。其他

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

+0

我做了一个快速测试,并且Socket.Select似乎正是我一直在寻找的东西。谢谢你,你真棒! – Tim

0

只要继续阅读。如果没有任何结果,您将获得某种类型的流结束指示,具体取决于您的API。

相关问题