2009-12-02 12 views
1

전 dotnet 프로 그램 머입니다. 최근에 저는 연결을 위해 system.net.sockets를 사용하는 클라이언트 응용 프로그램을 작성했습니다. 클라이언트는 클라이언트가 byte.minvalue를 보내 타이머를 보냈습니다. 클라이언트가 연결을 끊었을 때 소켓을 종료하고 닫습니다. 이 작업은 문제가 없지만 클라이언트 수를 늘리면 연결이 설정되지 않고 문제가 발생합니다. 2000 값의 백 로그를 사용하지만 올바르게 작동하지 않습니까? 도와주세요!소켓 대기열에 문제가 있습니까?

답변

1

상당히 모호합니다. 자세한 내용 (클라이언트 및/또는 서버에서 발생하는 오류) 또는 일부 코드 (서버에서 연결을 수락하는 방법)가 도움이 될 수 있습니다. 당신이 작성하고 신속하게 클라이언트의 연결을 파괴하는 경우 한편

, 나는

... 당신을 어떤 임의의 추측을 던질거야 당신은에 고객을 많이 실행하여 서버를 테스트하는 같은 기계를 사용하면 TIME_WAIT으로 인해 소켓이 고갈 될 수 있습니다. 마찬가지로 동일한 Windows 컴퓨터에서 많은 클라이언트 연결 (일반적으로 4000 개 이상)을 만들어 서버를 테스트하는 경우 기본 MAX_USER_PORT 설정으로 실행 중일 수 있으므로 동시 아웃 바운드 연결 수를 심각하게 제한합니다 시각.

0

OnClientAccept를 호출 할 때 왜 잠그고 있습니까? 병 목이야.

자물쇠가 필요한 경우 OnClientAccept 내부를 세밀하게 연마하십시오.

또한. 속도를 높이려면 BeginAccept/EndAccept로 전환하십시오.

internal class SocketServer 
{ 
    private readonly IPAddress _address; 
    private readonly int _port; 
    private TcpListener _listener; 

    public SocketServer(IPAddress address, int port) 
    { 
     _address = address; 
     _port = port; 
    } 

    public void Start(int backlog) 
    { 
     if (_listener != null) 
      return; 

     _listener = new TcpListener(_address, _port); 
     _listener.Start(backlog); 
     _listener.BeginAcceptSocket(OnAccept, null); 
    } 

    private void OnAccept(IAsyncResult ar) 
    { 
     TcpClient client = null; 
     try 
     { 
      client = _listener.EndAcceptTcpClient(ar); 
     } 
     catch(Exception err) 
     { 
      // log here. Eat all exceptions so the server will not die. 
      // i usually have a ExceptionThrown event to let other code 
      // debug asynchrounous exceptions. 
     } 

     // Begin to accept clients asap 
     try 
     { 
      _listener.BeginAcceptTcpClient(OnAccept, null); 
     } 
     catch(Exception) 
     { 
      // read above exception comment. 
     } 


     // this accept failed, lets not do anything with the client. 
     if (client == null) 
      return; 

     try 
     { 
      OnClientAccepted(client); 
     } 
     catch(Exception) 
     { 
      // read above exception comment. 
     } 
    } 

    private void OnClientAccepted(TcpClient client) 
    { 
     throw new NotImplementedException(); 
    } 


} 
0

클라이언트의 연결/연결 해제 속도는 얼마나됩니까? TCP 소켓은 즉시 닫히지 않고 TIME_WAIT 상태로 들어가 잠시 멈춰 있습니다 (Windows에서는 기본값이 120 초라고 생각합니다). 이로 인해 모든 소켓이 사용 중이며 새 연결이 거부 될 수 있습니다. 여기

MSDN 정보 : 서버 유형에 http://msdn.microsoft.com/en-us/library/ms819739.aspx

는 :

netstat -a 

당신이 TIME_WAIT 연결의 수가 많은 경우

는 당신은 소켓에 대해 중지 폐쇄 시간을 줄일 필요가있다.

관련 문제