2013-08-11 1 views
1

PcapDot.Net 프로젝트 DLL을 사용하여 패킷을 보내고 있습니다 (Pcap 파일 사용).중간에 SendBuffer를 중지하는 방법 (PcapDot.Net 프로젝트)?

내 질문에 내가 중간에 전송을 중지하려는 경우 PacketCommunicator.Break() 시도하고 나는 여전히 패킷을 보낼 계속 Wireshark 볼 수 있습니다. 나는 또한 PacketCommunicator.Dispose()을 시도하고이 경우에는 크래쉬 만 발생합니다. vshots.exe가 작동을 멈췄습니다.

+0

패킷 중간에서 멈추고 싶습니까? – Vadim

+0

재생 중간에 정지 버튼이 있습니다.이 버튼이 실행되면 즉시 재생을 멈추고 캡처가 완료 될 때까지 기다리지 않으려 고합니다. – user2214609

+0

전송에 대해 묻는 질문이 있습니까? – Vadim

답변

3

PacketCommunicator.Break()는 여기서 도움이되지 않습니다. 그것은 전송이 아니라 캡처를 중지하기위한 것입니다. 지금까지 보았 듯이 라이브러리에서 원하는 것을 수행 할 명확한 방법이 없으므로 해결 방법 만 제안합니다. 그들이 도움이되는지 아닌지 확인 - 개발자에게 문의하여이 기능을 요청하십시오.

옵션 1 - 각 패킷을 PacketCommunicator.SendPacket()을 사용하여 루프로 개별적으로 보낼 수 있습니다. 이 속도는 느려지지만 루프의 조건을 수정하여 각 패킷 이후에 중지 할 수 있습니다.

옵션 2 - 당신은

int packetsInBatch = MAX_PACKETS_IN_BATCH;  
while (inputCommunicator.ReceivePacket(out packet) == PacketCommunicatorReceiveResult.Ok && packetsInBatch > 0) 
{ 
    sendBuffer.Enqueue(packet); 
    ++numPackets; 
    --packetsInBatch; 
} 

처럼 무언가로 패킷

변경

while (inputCommunicator.ReceivePacket(out packet) == PacketCommunicatorReceiveResult.Ok) 
{ 
    sendBuffer.Enqueue(packet); 
    ++numPackets; 
} 

의 작은 배치로하지만 사용 PacketCommunicator.Transmit를 보내고 루프를 위해 다른 모든 것을 넣을 수 있습니다. 이렇게하면 일괄 처리가 끝난 후 루프를 중지 할 수 있으며 중지 신호를 보낸 후 속도와 지연 간의 균형을 취하게됩니다.

옵션 3 - 무의미하게 송신 버퍼를 강제 종료하십시오. sendBuffer.Dispose()를 호출하고 그 결과를 처리하십시오.

[HandleProcessCorruptedStateExceptions] 
private static void Transmit(PacketCommunicator outputCommunicator, PacketSendBuffer sendBuffer, bool isSync) 
    { 
     try 
     { 
      outputCommunicator.Transmit(sendBuffer, isSync);     
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e); 
     } 
    } 

당신은 AccessViolationException을 처리해야합니다. HandleProcessCorruptedStateExceptions 속성을 전송을 수행하기 위해 생성 한 새 메소드에 추가하여이 작업을 수행했습니다 (How to handle AccessViolationException 참조). 그것은 내 컴퓨터에서 작동하는 것처럼 보이지만 이것은 실제로 최후의 해결책입니다. 나는 아무것도 테스트하지 않고 가장 간단한 명령 행 유틸리티를 사용하지는 않을 것이다. 관리되지 않는 코드 작업이 진행 중이고이 트릭을 수행 할 때 리소스에 어떤 일이 발생하는지 알지 못합니다.

+0

SendPacket()을 사용하는 것이 최선의 선택이 될 것이라고 생각하지만, 문제가되는 것은 SendPacket()을 사용하여 패킷 간 지연없이 모든 패킷을 SendBuffer()와 비교한다는 것입니다. 패킷 TimeStamp , 나는 Thread.Sleep을 사용하고 싶지 않아, 그것을 할 수있는 최선의 선택은 무엇입니까? – user2214609

+0

Thread.Sleep이 충분히 좋을지는 모르겠지만, 시나리오에 따라 다릅니다. 패킷 양과 지연 시간입니다. 나는 당신이 멈추고 싶으면 즉시 당신이 보내는 것을 멈추는 것이 얼마나 중요한지 모르겠습니다. 나는 두 번째 옵션이 전반적으로 최고라고 생각한다. 당신은 두 번째 또는 두 번째 버퍼를 생성하고, 그 동안 지연을 최소화하기 위해 다음을 준비 할 수 있습니다. 나는 완성을 위해 세 번째 옵션 만 추가 했으므로 막대기로 만지지는 않을 것입니다. – Vadim

+0

세 번째 옵션이 잘못된 아이디어 인 이유는 무엇입니까? – user2214609

관련 문제