전 dotnet 프로 그램 머입니다. 최근에 저는 연결을 위해 system.net.sockets를 사용하는 클라이언트 응용 프로그램을 작성했습니다. 클라이언트는 클라이언트가 byte.minvalue를 보내 타이머를 보냈습니다. 클라이언트가 연결을 끊었을 때 소켓을 종료하고 닫습니다. 이 작업은 문제가 없지만 클라이언트 수를 늘리면 연결이 설정되지 않고 문제가 발생합니다. 2000 값의 백 로그를 사용하지만 올바르게 작동하지 않습니까? 도와주세요!소켓 대기열에 문제가 있습니까?
1
A
답변
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 연결의 수가 많은 경우
는 당신은 소켓에 대해 중지 폐쇄 시간을 줄일 필요가있다.관련 문제
- 1. 내 스레드가 대기열에 있습니까?
- 2. 소켓 프로그램에 문제가 있습니다.
- 3. 소켓 서버에 연결할 때 문제가 있습니까?
- 4. 블랙 베리의 소켓 코드에 어떤 문제가 있습니까?
- 5. 대기열에 닿기를 막을 수 있습니까?
- 6. 소켓 연결 요청에 문제가 있습니다.
- 7. 간단한 HTTP 프록시 스크립트에 어떤 문제가 있습니까? (파이썬 소켓 기반)
- 8. 시스템 알림 대기열에 적절한 방법이 있습니까?
- 9. UITableViewCell이 대기열에 포함되지 않도록 할 수 있습니까?
- 10. Java 대기열/목록에 대한 원자 적으로 "여유 공간 또는 대기열에서 대기열에 넣은 다음 대기열에 넣을 경우 대기열에 넣을 수 있습니까?"
- 11. IO :: 소켓 TCP 연결에 문제가 발생했습니다.
- 12. NServiceBus가 오류 대기열에
- 13. 열거하는 동안 대기열에 삽입
- 14. Flash 소켓 정책 파일 작동에 문제가 발생했습니다.
- 15. 스레딩을 사용할 때 소켓 문제가 발생했습니다.
- 16. 유닉스 도메인 소켓 차단 문제가 있습니다.
- 17. JMS 대기열에 메시지를 테스트하십시오.
- 18. 비어 있지 않은 경우 잠금 대기열에 대기열에 넣기
- 19. [Pattern] 트랜잭션을 대기열에 보관하십시오.
- 20. C# 대기열에 대한 조언
- 21. 파이썬 코드에 문제가 있습니까? (함수)
- 22. 비 소켓 소켓 작업
- 23. 대기열에 데이터를 추가하는 모범 사례
- 24. Zend 작업 대기열에 대한 대안
- 25. 리눅스 소켓 호출을 추적하고 있습니까?
- 26. (도움말) 소켓 설명자에서 소켓 유형을 찾을 수 있습니까?
- 27. Android :보기의 메시지 대기열에 이벤트 게시
- 28. Windows 소켓 소켓 성능
- 29. 자바 : 소켓 대 소켓
- 30. 대기열의 Java 소켓 연결