2011-12-28 3 views
2

를 수신 할 때 판독을 중지 I는 원시 데이터 (아닌 문자열) NetworkStream.Read 및 NetworkStream.Write을 사용하여 88 바이트를 전송하는 프로그램을 .는 NetworkStream은 값 10 (개행 문자)와 바이트

바이트 번호 (58)는 값 10 (새로운 라인)를 가지고 발생한다. 수신 프로그램 인스턴스 스트림은 원시 데이터에 대한 읽기 대신 ReadLine처럼이 바이트가 수신되면 읽기를 중지합니다.

시나리오 I 한 번에 32 바이트를 판독하도록 변경된 때, 동일한 바이트에서 정지 한 후 32 26 (총 58)을 읽어 일치한다. 나는 동일한 시스템에서 두 인스턴스를 실행할 때 나는 포트 21을 사용하여 인터넷을 통해 연결된 다른 컴퓨터에있는 두 개의 프로그램 인스턴스를 실행할 때 이것은

, 전체 88 바이트는 아무런 문제없이 수신됩니다.

나는 30 바이트이 지워지 위치를 확인하기 위해 네트워크 모니터를 사용하지만, 나는 제안 여기 물어 생각 또는 누군가가 비슷한 문제에 직면합니다.

편집 : 여기

코드입니다 : 여기에 코드입니다. 그것은 하나 개의 스트림에서 데이터를 읽고 다른 두 가지 작업에 기록 : `

class ProxyConnection 
{   
private NetworkStream clientStream; 
private NetworkStream serverStream; 
public ProxyConnection() 
{ 
..   clientStream = tcpClient.GetStream(); 
      serverStream = tcpServer.GetStream(); 
..} 

private void RouteFromClientToServer() 
{ 
    Message message; 
    while (true) 
    { 
    try 
    { 
     message = ReadMessageFromClient(); 
     ValidateMessage(message); 
     SendMessageToServer(message); 
    } 
    catch(IOException e) 
    { 
     Logger.getInstance().log(e.Message); 
     break; 
    } 
    } 
} 
     private Message ReadMessageFromClient() 
     { 
      Message message = new Message(); 
      message.bytes = new byte[MESSAGE_SIZE]; 
      message.bytesCount = clientStream.Read(message.bytes, 0, MESSAGE_SIZE); 
      Logger.getInstance().log("Size (" + message.bytesCount + ") From Client"); 
      return message; 
} 



    private void SendMessageToServer(Message message) 
    {  
     serverStream.Write(message.bytes, 0, message.bytesCount); 
     Logger.getInstance().log("Size (" + message.bytesCount + ") To Server"); 
     serverStream.Flush(); 
    } 


} 
+2

데이터를 읽는 데 사용하는 코드를 게시 할 수 있습니까? 당신은 기계들 사이에 어떤 종류의 프록시를 사용하고 있습니까? –

+2

다른 읽으 셨다면 나머지를 읽을 수 있습니까? – cHao

+0

@JeremyMcGee 코드를 추가했습니다. 기계 중 하나가 제 작업장에 있으므로 프록시가있을 수 있습니다. –

답변

0

TCP 소켓은 특히 보내거나 한 번에 받고 싶은 얼마나 많은 바이트 상관하지 않습니다. 데이터 또는 공간을 사용할 수있는 경우 처리 할 수있는만큼 데이터를 수신하거나 전송합니다. 공간이나 데이터가 없으면 보내거나받을 수있는 일이있을 때까지 차단할 수 있습니다. 그러나 버퍼에 10 바이트의 공간이 있고 50 개를 보내는 경우 소켓은 행복하게 10 바이트를 버퍼에 넣고 "10 바이트를 보냈습니다. 나머지는 조금 보내보십시오." 마찬가지로 사용할 수있는 10 바이트가 있고 50을 원할 경우 소켓에 "여기에 10이 있습니다. 이후에 소켓에서 수신 또는 전송하면 일반적으로 더 많은 데이터 또는 공간이있을 때까지 차단 한 다음 그 시간에 사용 가능한만큼 읽거나 쓸 수 있습니다. 그래서 그들이 얼마나 많은 양의 데이터를 뒤섞 었는지 반환합니다.

일반적인 유스 케이스이기 때문에 스트림을 통해 텍스트를보다 쉽게 ​​처리 할 수 ​​있도록하기 위해 (예 : 10을 보내는 중에 자동 플러시와 같은) 약간의 마법이있을 수 있습니다. 그러나 다시 읽으면 더 많은 데이터를 얻어야합니다. 0 바이트를 반환하지 않는 한 일반적으로 연결이 끊어 졌음을 의미하며 소켓을 닫거나 처리하기 전에 소켓을 종료하지 않는 것입니다.

+0

다음은 클래스입니다. 그것은 하나의 스트림에서 데이터를 읽고 두 방법으로 작동하는 다른 스트림에 데이터를 씁니다. –

+0

게시 된 코드가 작동하지 않지만 일단 스트림을 설정하는 코드를 추가하고 스텁'ValidateMessage' 기능을 추가하면'Message'와' Logger 클래스는 잘 동작합니다. 모든 크기의 덩어리로 전송된다는 보장은 없지만 모든 것을 제공하지 못하게하는 데 문제가 없습니다. 문제는 게시되지 않은 코드 또는 클라이언트 또는 서버에있는 다른 곳에서 발생합니다. – cHao

0

어떤 포트를 사용하고 있습니까? 프록시 서버가 있습니까? 당신이 포트 21을 사용하는 경우

특히, (FTP) 일부 프록시 서버는 수동 FTP의 특별한 경우의 처리가 있습니다. 나는 이것이 프록시를 통해 트래픽을 검사해야한다고 생각한다. 특히 명령이 유효하지 않다면 프록시가 소켓 연결을 닫는 것을 보게 될 것이다.

해결 방법은 다른 포트를 사용하는 것입니다.