2010-05-05 3 views
3

소켓은, 사실은 여기 서버의 코드 (클라이언트가이 경우에 파이어 폭스입니다), 방식은 내가 만드는 것입니다 전에이 expirienced 결코 방청내가 이상한 문제가 생겼

while(_IsWorking) 
{ 
    if(listener.Socket.Poll(-1, SelectMode.SelectRead)) 
    { 
     Socket clientSocket = listener.Socket.Accept(); 
     clientSocket.Blocking = false; 
     clientSocket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, true); 
    } 
} 

그래서 새 연결이 올 때까지이 listener.Socket.Poll에 걸 기대하고 있습니다 만, 첫 번째 온다 후 영원히 설문 조사에 응답 : 연결에 동의합니다. 나는 더 작은 지연을 가지고 그것을 끊임없이 폴링하려고 시도했다. 10 마이크로 초라고하자. 그런 다음 SelectMode.SelectRead에 결코 들어 가지 않는다. 아마도 클라이언트의 소켓 재사용과 어떻게 든 관련이 있다고 생각하십니까? 어쩌면 클라이언트 소켓을 제대로 종료하지 않고 클라이언트 (파이어 폭스)가 이전 소켓을 사용하기로 결정했을까요?

Context.Socket.Shutdown(SocketShutdown.Both); // context is just a wrapper around socket 
Context.Socket.Close(); 

무슨 문제가 발생할 수 있습니다 :

나는 클라이언트 소켓이 방법을 분리?

답변

1

원격 클라이언트를 비동기 적으로 수용하는 것으로 생각하십니까? I answered a similar question은 최근에 TCPListener에 있지만 동일한 패턴이 Socket 클래스에서 사용될 수 있습니다. 내가 .NET 반사판을 사용하여 Sockets.TCPListener.Pending() 방법 내부의 모양을 가지고 그들이 대신이

listener.Socket.Poll(-1, SelectMode.SelectRead)) 

, 어쩌면 당신이 시도 할 수 있습니다 : 클라이언트가 연결을 사용할 수있는 경우 내가 이전에 사용이 본 적이 없다

확인하기 그것은 :

public bool Pending() 
{ 
    if (!this.m_Active) 
    { 
     throw new InvalidOperationException(SR.GetString("net_stopped")); 
    } 
    return this.m_ServerSocket.Poll(0, SelectMode.SelectRead); 
} 

그냥 MSDN에 따라 TCPListener.Pending() 방법은 당신에게 100 % 도움이된다면 그렇게 확신하지 차단 비입니다 명심?

+0

내가 설명한 행동에 대한 이유를 발견했다고 생각합니다. 이것은 클라이언트 소켓을 처리하지 않고 연결을 끊지 않았기 때문이며, 새로운 연결을 만들지 못했기 때문에 클라이언트의 것과 관련이있는 것 같아요. (이 경우 파이어 폭스) 가능한 한 한 소켓 (서버에 의해 닫히지 않은 경우)을 사용하고자합니다. – hoodoos

+0

실제로 당신이 언급 한 질문에서 그 사람은 그것을 완전히 잘못 했어요 :) 그리고 실제로 그가 보류중인 수표 사이에 잠을 잤다는 것을 언급하지 않았지만, 나는 실제로 어떤 목적으로 그는 비 차단 방식으로 듣고 있었는지 모르겠다. – hoodoos

관련 문제