2010-05-13 5 views
3

메신저는 다중 스레드 된 winsock 응용 프로그램을 작성하고 소켓을 닫는 데 몇 가지 문제가 있습니다. 우선, 동시에 열 수있는 소켓의 수에는 제한이 있습니까? 한 번에 32 개의 소켓처럼 말할 수 있습니다.SO_LINGER 및 닫는 소켓 (WINSOCK)

나는 소켓 중 하나에 연결을 설정하고 정보를 전달하고 모두 올바르게 진행됩니다. 문제는 소켓을 연결 해제 한 다음 동일한 대상에 다시 연결할 때 SYN 이후 서버에서 RST가 발생합니다. 서버 응용 프로그램에 대한 코드가 없어서 디버깅 할 수 없습니다.

SO_LINGER를 사용하고 각 세션이 끝날 때마다 RST 플래그를 보냈습니다. 하지만이 방법으로 내 연결을 종료하고 싶지 않습니다. SO_LINGER을 사용하지 않을 때 FIN 플래그가 전송되었지만 연결이 실제로 닫히지 않은 것으로 보입니다.

어떤 도움이 필요합니까? 감사합니다.

답변

1

유닉스에는 프로세스 당 파일 설명자 제한이 있습니다. Windows에서는 "처리"라고 추측합니다.

아마도 클라이언트 포트는 고정 포트로 bind()입니다. 서버가 후속 연결을 거부하는 이유 일 수 있습니다. 임시 임시 포트를 사용해보십시오.

2

첫째로, 나는 Nikolai에 동의합니다. 클라이언트 소켓을 바인딩하고 있습니까?

그렇다면 서버 측 소켓이 여전히 TIME_WAIT이고 새 연결 시도가 삭제되는 것 같습니다. 서버에 클라이언트 소켓을 바인딩하여 서버가 현재 2MSL 대기 기간에있는 동일한 동일한 연결을 다시 시도하고 재사용하도록 시도하면 현재 시점에서 재사용 할 수 없으므로보고있는 내용을 볼 수 있습니다. . 보통 클라이언트 포트를 바인드 할 필요가 없으며 그렇게하지 않으면 문제가 사라질 수 있습니다.

둘째로, 예, Windows 플랫폼에서 열린 소켓의 수에는 제한이 있지만 하드 코딩 된 번호가 아니라 리소스와 관련이 있습니다.

각 열린 소켓은 일부 '비 페이징 풀'메모리를 사용하며 소켓에서 보류중인 읽기 또는 쓰기 요청은 '페이징되지 않은 풀'을 사용하고 입출력 중에 메모리 페이지가 메모리에 잠겨 있습니다. 잠글 수있는 페이지 수에 대한 제한). Vista에서 말했고 나중에 Windows의 이전 버전보다 훨씬 더 많은 '비 페이징 풀'이 사용 가능하며 꽤 낮은 사양의 XP 상자 (여기를 참조하십시오 : http://www.lenholgate.com/blog/2005/11/windows-tcpip-server-performance.html)에서 70,000 개 이상의 동시 활성 연결을 달성 할 수있었습니다. 수립 할 수있는 아웃 바운드 연결 수에는 몇 가지 제한이 있습니다 (이는 사용자가 관심을 가질 가능성이 높음). 기본적으로 약 4000 개이며 MAX_USER_PORT을 참조하여 조정할 수 있습니다. 자세한 내용은 Maximum number of concurrent TCP/IP connections - Win XP SP3을 참조하십시오.

+0

한 가지를 언급하는 것을 잊었습니다. 단일 스레드를 실행할 때이 문제가 발생하지 않습니다. 모두 올바르게 연결됩니다. 동시에 2 개 이상의 스레드 (각각 16 개의 다른 서버로 보내는 16 개의 다른 소켓 열기)를 전송하면 어딘가에 연결이 끊어집니다. –

+0

클라이언트 소켓을 바인딩하고 있습니까? –