[c] 연결 거부 오류의 원인은 무엇입니까?

다른 클라이언트를 사용하여 C로 서버 프로그램을 작성하려고합니다. 예를 들어 포트 2080을 통해 연결하려고하면이 오류가 발생합니다.

connection refused

이 오류의 원인은 무엇입니까?



답변

여러 가지 이유가있을 수 있지만 가장 일반적인 이유는 다음과 같습니다.

  1. 대상 컴퓨터에서 포트가 열려 있지 않습니다.

  2. 대상 컴퓨터에서 포트가 열려 있지만 보류중인 연결의 백 로그가 가득 찼습니다.

  3. 클라이언트와 서버 사이의 방화벽이 액세스를 차단하고 있습니다 (로컬 방화벽도 확인).

방화벽을 확인하고 포트가 열려 있는지 확인한 후 텔넷을 사용하여 ip / port에 연결하여 연결을 테스트합니다. 이렇게하면 응용 프로그램에서 잠재적 인 문제가 제거됩니다.


답변

오류는 수신 소켓의 OS가 인바운드 연결 요청을 인식했지만 의도적으로 거부하도록 선택했음을 의미합니다.

중간 방화벽이 방해가되지 않는다고 가정 할 때 OS가 인바운드 연결 요청을 거부하는 이유는 두 가지뿐입니다. 한 가지 이유는 이미 여러 번 언급되었습니다. 연결된 청취 포트가 열려 있지 않습니다.

아직 언급되지 않은 또 다른 이유가 있습니다. 수신 포트가 실제로 열려 있고 활발하게 사용되고 있지만 대기중인 인바운드 연결 요청의 백 로그가 최대 값에 도달했기 때문에 인바운드 연결 요청을 대기 할 공간이 없습니다. 순간. 서버 코드가 새 대기열 항목에 대해 사용 가능한 슬롯을 지우는 데 아직 충분한 시간 동안 accept ()를 호출하지 않았습니다.

잠시 기다렸다가 다시 연결해보십시오. 안타깝게도 “포트가 전혀 열려 있지 않음”과 “포트가 열려 있지만 지금 너무 바쁘다”를 구분할 방법이 없습니다. 둘 다 동일한 일반 오류 코드를 사용합니다.


답변

다른 호스트에 대한 TCP 연결을 열려고 할 때 “연결이 거부되었습니다.”라는 오류가 표시되면

  1. TCP SYN 패킷을 다른 호스트로 보냈습니다.
  2. 그런 다음 응답으로 TCP RST 패킷을 받았습니다.

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 주소 또는 잘못된 포트에 연결 중이거나 서버가 잘못된 포트에서 수신 중이거나 실제로 실행되고 있지 않습니다.

일반적인 실수는 네트워크 바이트 순서로 바인딩하거나 연결할 때 포트 번호를 지정하지 않는 것입니다.


답변

서버 측에서 포트 2080에서 수신 대기 중인지 확인하십시오. 먼저 해당 포트에 텔넷을 발행하여 서버 시스템에서 확인하십시오.

텔넷 로컬 호스트 2080

듣고 있으면 응답 할 수 있습니다.


답변

1. 서버 상태를 확인하십시오.

2. 포트 상태를 확인하십시오.

예 : 3306 netstat -nupl|grep 3306.

3. 방화벽을 확인하십시오. 예를 들어 3306을 추가하십시오.

vim /etc/sysconfig/iptables
# add
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT


답변

귀하의 상황에 해당하지 않는 것 같지만 때로는 연결 거부 오류가 네트워크에 IP 주소 충돌이 있음을 나타낼 수도 있습니다. 다음을 실행하여 가능한 IP 충돌을 검색 할 수 있습니다.

 arp-scan -I eth0 -l | grep <ipaddress>

arping <ipaddress>

AskUbuntu 질문에는 더 많은 정보가 있습니다.