2012-09-05 70 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。

相關問題