2011-02-02 2 views
1

나는 아주 이상한 버그가있어서 여기에 대해서는 거의 알지 못하므로 나와 함께 참아주십시오.C# 비동기 수신은 시스템 전체의 네트워크 충돌을 일으 킵니다!

하드웨어를 연결하는 소켓이 있습니다. 나는 동기식으로 보내지 만 비동기식으로 수신한다.

나는 다음과 같은 코드를 통해 데이터를 전송 :

_dicSockets[lclIPEndPoint].Send(lclBytesSent, lclBytesSent.Length, SocketFlags.None); 

다음과 같은 코드를 통해 나타납니다 하드웨어가 신속하게 응답 할 때

protected virtual void receiveCallback(IAsyncResult ar) 
     { 
      PFDoReceiveDataArgs receiveData = (PFDoReceiveDataArgs)ar.AsyncState; 
      Socket lclSocket = receiveData.MySocket; 
      etc... 

이 제도는 십초 내에서 잘 작동합니다. 그러나 하드웨어가 응답하는 데 오래 걸리면 (약 5 분) 미친 문제가 발생합니다. 이 시간 동안 while 루프에있는 스레드가있어 명령이 응답을 받았는지 여부를 확인합니다.

이 시간 동안 하드웨어가 작동하고 작동한다는 것을 알고 있습니다. 명령을 보내면 5 분 후 응답이옵니다. 5 번 중 4 번은 문제가 없으며 모든 것이 예상대로 작동합니다. 동일한 명령, 동일한 하드웨어, 같은 모든 것 ...

5 회 중 1 회, 인터넷 연결이 끊긴 곳에서 시스템 전체에 네트워크 장애가 발생했습니다!

문제가 무엇인지 전혀 알지 못하므로 필자는 아이디어를 기다리고 필요한만큼 코드를 붙여 넣을 것입니다.

+0

당신이 말하는 하드웨어는 무엇입니까? – RQDQ

+0

"system-wide"란 네트워크에있는 모든 컴퓨터가 연결을 끊거나 코드를 실행하는 컴퓨터 한 대를 의미합니까? – Justin

+0

코드를 실행하는 컴퓨터. – sbenderli

답변

1

직접 문제와 관련이 없을 수도 있지만 컨트롤이 receiveCallback 메서드 컨텍스트를 떠나기 전에 소켓 인스턴스를 처리해야합니다.

+0

현재 내 프로그램에서 소켓을 계속 사용하고 프로그램을 종료 한 후에 만 ​​처분합니다. 이것에 대해 조언 해 주시겠습니까? – sbenderli

0

의심스러운 경우 네트워크를 차단하십시오. 몇 년 전에 네트워크상의 컴퓨터가 비정상적인 패킷을 전송하여 주기적으로 주 Cisco 스위치를 사용 중지하는 문제가있었습니다. 당신이 말하는 하드웨어의 신비한 부분은 5 번 중 1 번 끔찍한 트래픽을 방송 할 것입니다.

일이 잘못되고 문제를 좁힐 수있는 동안 네트워크를 스니핑하여 문제를 발견했습니다.

+0

나는 당신의 제안을 시도 할 것입니다, 고맙습니다. – sbenderli

관련 문제