다른 클라이언트를 사용하여 C로 서버 프로그램을 작성하려고합니다. 예를 들어 포트 2080을 통해 연결하려고하면이 오류가 발생합니다.
connection refused
이 오류의 원인은 무엇입니까?
connect()
사용할 준비가 된 특정 IP 및 포트에 따라 다릅니다.
다른 클라이언트를 사용하여 C로 서버 프로그램을 작성하려고합니다. 예를 들어 포트 2080을 통해 연결하려고하면이 오류가 발생합니다.
connection refused
이 오류의 원인은 무엇입니까?
connect()
사용할 준비가 된 특정 IP 및 포트에 따라 다릅니다.
답변:
여러 가지 이유가있을 수 있지만 가장 일반적인 이유는 다음과 같습니다.
대상 컴퓨터에서 포트가 열려 있지 않습니다.
대상 컴퓨터에서 포트가 열려 있지만 보류중인 연결의 백 로그가 가득 찼습니다.
클라이언트와 서버 사이의 방화벽이 액세스를 차단하고 있습니다 (로컬 방화벽도 확인).
방화벽을 확인하고 포트가 열려 있는지 확인한 후 텔넷을 사용하여 ip / port에 연결하여 연결을 테스트합니다. 이렇게하면 응용 프로그램에서 잠재적 인 문제가 제거됩니다.
오류는 수신 소켓의 OS가 인바운드 연결 요청을 인식했지만 의도적으로 거부하도록 선택했음을 의미합니다.
중간 방화벽이 방해가되지 않는다고 가정 할 때 OS가 인바운드 연결 요청을 거부하는 이유는 두 가지뿐입니다. 한 가지 이유는 이미 여러 번 언급되었습니다. 연결된 청취 포트가 열려 있지 않습니다.
아직 언급되지 않은 또 다른 이유가 있습니다. 수신 포트가 실제로 열려 있고 활발하게 사용되고 있지만 대기중인 인바운드 연결 요청의 백 로그가 최대 값에 도달했기 때문에 인바운드 연결 요청을 대기 할 공간이 없습니다. 순간. 서버 코드가 새 대기열 항목에 대해 사용 가능한 슬롯을 지우는 데 아직 충분한 시간 동안 accept ()를 호출하지 않았습니다.
잠시 기다렸다가 다시 연결해보십시오. 안타깝게도 "포트가 전혀 열려 있지 않음"과 "포트가 열려 있지만 지금 너무 바쁘다"를 구분할 방법이 없습니다. 둘 다 동일한 일반 오류 코드를 사용합니다.
다른 호스트에 대한 TCP 연결을 열려고 할 때 "연결이 거부되었습니다."라는 오류가 표시되면
RST는 연결을 재설정해야 함을 나타내는 TCP 패킷의 비트입니다. 일반적으로 다른 호스트가 사용자의 연결 시도를 수신하고 적극적으로 TCP 연결을 거부하고 있음을 의미하지만 때때로 개입 방화벽이 사용자의 TCP SYN 패킷을 차단하고 TCP RST를 사용자에게 다시 보낼 수 있습니다.
https://tools.ietf.org/html/rfc793 69 페이지를 참조 하십시오 .
SYN 수신 상태
RST 비트가 설정된 경우
이 연결이 수동 OPEN (즉, LISTEN 상태에서 온)으로 시작된 경우이 연결을 LISTEN 상태로 되돌리고 반환합니다. 사용자에게 알릴 필요가 없습니다. 이 연결이 활성 OPEN (즉, SYN-SENT 상태에서 온)으로 시작된 경우 연결이 거부 된 것입니다. 사용자에게 "연결 거부"신호를 보냅니다. 두 경우 모두 재전송 큐의 모든 세그먼트를 제거해야합니다. 그리고 활성 OPEN 케이스에서 CLOSED 상태로 들어가 TCB를 삭제하고 돌아갑니다.
연결이 거부 됨은 연결하려는 포트가 실제로 열려 있지 않음을 의미합니다.
따라서 잘못된 IP 주소 또는 잘못된 포트에 연결 중이거나 서버가 잘못된 포트에서 수신 중이거나 실제로 실행되고 있지 않습니다.
일반적인 실수는 네트워크 바이트 순서로 바인딩하거나 연결할 때 포트 번호를 지정하지 않는 것입니다.
업무용 컴퓨터에서도 같은 문제가 발생합니다. 문제는 localhost를 입력하면 로컬 주소가 아닌 프록시의 주소로 이동한다는 것입니다.이 단계를 따르십시오.
Chrome => 설정 => 프록시 설정 변경 => LAN 설정 => 로컬 주소에 대해 프록시 서버 우회를 선택합니다.
나는 완전히 다른 원인으로 동일한 메시지를 가졌습니다 wsock32.dll
. ::socket(PF_INET, SOCK_STREAM, 0);
호출은 반환 유지 INVALID_SOCKET
하지만 이유는 윈속 DLL이로드되지 않았습니다이었다.
결국 나는 Sysinternals의 프로세스 모니터를 시작했고 그것이 '모든 곳에서'dll을 검색했지만 찾지 못했다는 것을 알았습니다.
침묵의 실패는 대단합니다!
ping
ed 될 수 있었고 downforeveryoneorjustme.com 은 그것이 나뿐만 아니라 FTP를 통해 액세스 할 수도 있음을 보여주었습니다. 몇 분 후 실수가 해결되었습니다.