2009-11-24 3 views
0

소켓 프로그래밍에 관해서는 문언이나 믹스 업을 선택하지 마십시오. TCP 서버에 연결하고 메시지를 쓰고 응답을 처리하려고합니다.TCP 서버가 객체를 처리 할 때까지 소켓에서 읽지 못함

Dim tcpClient As Sockets.TcpClient = New TcpClient() 

tcpClient.Connect(hostname, 9080) 

Dim networkStream As NetworkStream = tcpClient.GetStream() 

If networkStream.CanWrite And networkStream.CanRead Then 

    Dim sendBytes As [Byte]() = Encoding.ASCII.GetBytes(body) 
    networkStream.Write(sendBytes, 0, sendBytes.Length) 

    Dim bytes(tcpClient.ReceiveBufferSize) As Byte 
    networkStream.Read(bytes, 0, CInt(tcpClient.ReceiveBufferSize)) 

    Dim returndata As String = Encoding.ASCII.GetString(bytes) 
End If 

나는 서버 로그를보고 내가 디버깅을 중지 할 때 서버가 오직 소켓 에서 읽는 것을 알 수 있습니다 : 나는 다음과 같은 코드를 사용합니다. 그런 다음 메시지를 처리하고 응답을 보냅니다. 클라이언트가 더 이상 청취하지 않아 조금 늦었습니다.

networkStream 개체를 먼저 닫아야합니다. 그러나이 작업을 수행하면 이후의 대응을 처리 할 수 ​​없습니다. 필자가 작성한 서버에 '신호'를 보내야합니까? 다른 모델을 모두 사용해야합니까?

+1

TCP 서버도 코딩 했습니까? 그렇다면 들어오는 연결을 처리하는 코드를 게시 할 수 있습니까? – ristonj

+0

좋은 지적 (따라서 upvote :). TCP 서버 소스에 액세스 할 수 없습니다. –

답변

1

NetworkStream을 닫거나/버리는 것은 필요하지 않지만 데이터를 보내는 방식에 의문을 제기합니다. 서버를 작성 했습니까? 나는 보내고받는 데이터의 길이 접두사 나 종료 문자 나 구를 기대한다. 이와 같은 데이터를 쓰면 서버는 읽어야하는 데이터의 양을 알 수 없습니다.

수신 코드도 마찬가지입니다. 서버가 보낸 길이를 사용하기보다는 단순히 ReceiveBufferSize까지 읽으려고합니다.

사용중인 프로토콜에 이러한 요소가 포함되지 않았습니까?

또한 염두에 곰 Read 가장/다른 모든 Stream 객체와 마찬가지로, 당신은 당신이 요청하는 바이트 수를 얻을 수 있습니다하지 보장을한다는 것을. 까지 최대 바이트 수와 함수 반환 값은 읽은 횟수를 나타냅니다. 일반적으로 특정 번호를 얻기 위해 루프 구조를 설정해야합니다. 뭔가가 ...

int bytesToRead = 1024; // sample 
int totalBytesRead = 0; 
int bytesRead = 0 

while(bytesToRead > 0) 
{ 
    bytesRead = stream.Read(buffer, totalBytesRead, bytesToRead); 

    if(bytesRead == 0) throw new Exception("Connection closed"); 

    totalBytesRead += bytesRead; 
    bytesToRead -= bytesRead; 
} 

이것은 구현해야 할 일에 대한 아이디어를 얻기 위해 일반적인 구현보다 다소 장황합니다. 좀 더 일반적인 것은 다음과 같습니다 :

int bytesToRead = 1024; 
int bytesRead = 0; 

while((bytesRead += stream.Read(buffer, bytesRead, bytesToRead - bytesRead) <= bytesToRead - bytesRead) { } 
관련 문제