2012-09-05 2 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 초의 제한 시간과 문제의 소켓을 가독성 목록에 전달하면 즉시 확인하고 즉시 다시보고합니다.

다른 두 옵션을 사용합니다 (Receive 호출의 일부로서) 찾을 수 있도록 들어오는 데이터가 있는지, 당신의 소켓에 Socket.ReceiveTimeout을 설정하거나 Socket.Blocking를 사용하여 소켓이 아닌 차단을 할 수 있습니다. 하지만 .NET에서 약간 불편한 것처럼 보입니다. 단순히 값을 반환하는 것보다는 예외를 throw하므로 코드가 좀 더 길어질 수 있습니다.

+0

나는 빠른 테스트를했고, Socket.Select가 정확하게 내가 찾고있는 것 같다. 고마워요, 굉장 해요! – Tim

0

계속 읽기. 아무것도 남아 있지 않으면 API에 따라 일종의 스트림 끝 표시가 나타납니다.

관련 문제