2013-10-07 2 views
0

(실제 코드는 여기서는별로 중요하지 않으므로이 질문에 코드를 넣지 않았습니다. 그렇다면이 코드는 나중에 편집 할 수 있습니다.)Winsock2 non-local refused

저는 winsock2 또는 다른 네트워킹 API를 처음 사용했습니다. 서버가 클라이언트에 문자열을 보낸 다음 연결을 끊는 매우 간단한 서버 응용 프로그램과 클라이언트 응용 프로그램이 있습니다. 나는 inet_addr() 인수로 localhost 또는 127.0.0.1를 사용할 때

응용 프로그램은 잘 작동하지만 내 "진짜"IP를 사용하는 경우, 클라이언트 응용 프로그램은 WSAECONNREFUSED를 얻고 서버는 표시되지 않습니다. 포트가 두 응용 프로그램에서 동일하고 프로토콜도 동일하다는 것을 확인했습니다.

[편집] 잠시 동안 네트워킹을 포기한 후에이 문제로 돌아 왔습니다. 이게 실제로 라우터에서 사용하고 있다는 사실과 뭔가 관련이있을 수 있다고 생각합니다.

답변

1

WSAECONNREFUSED은 피어 또는 중간 방화벽에 의한 연결 거부를 적극적으로 거부합니다. 상대방이 발행 한 것이라면 IP 주소 나 포트가 잘못되었음을 의미합니다. 그렇지 않으면 올바르게 작동하지만 서버가 실제로 실행되고 있지 않습니다. 어쨌든, 그 IP : port를 듣는 것은 아무것도 없습니다. 방화벽 인 경우 조정하십시오.

포트 번호에 htons()을 사용하셨습니까?

+0

호스트 중 하나 또는 모두에서 네트워크 분석기 (tcpdump, wireshark 등)를 사용하면 문제의 근본 원인을 알 수 있습니다. –

+0

예'htons()'를 사용했고, 서버가 작동하는 동안 내 IP를 사용했습니다. 서버가 제대로 작동하는지 확인하기 위해'localhost'와'127.0.0.1'를 사용하여 검사했습니다. 나는 방화벽에 규칙을 추가하여 해당 포트에서 항상 허용 및 금지 (그리고 규칙을 맨 위로 이동)했지만 처음에는 방화벽의 기능을 사용한 적이 처음 이었기 때문에 내가 그랬는지 잘 모르겠습니다. 그것 올바르게. – rsethc

+0

또한 포트는 로컬 주소로 시도하고 내 '실제'IP를 사용하는 사이에 클라이언트 또는 서버의 포트에 대해 아무 것도 변경하지 않았으므로 전혀 중요하지 않습니다. – rsethc

0

inet_addr()gethostbyname() 또는 getaddrinfo()을 사용하여 localhost 또는 다른 호스트 이름 문자열을 IP 주소로 확인해야합니다.

WSACONNREFUSED은 연결하려는 원격 쪽에서 연결이 적극적으로 거부되었음을 의미합니다.

서버 컴퓨터가 거부하는 경우 요청한 IP : 포트에서 수신 대기하는 소켓이 없거나 보류중인 클라이언트 연결 대기열이 가득 찼기 때문에 그 순간에 새 연결을 수락 할 수 없음을 의미합니다 .

라우터가 거부하는 경우 일반적으로 라우터가 요청한 IP : 포트의 인바운드 연결을 라우터 네트워크의 컴퓨터로 전달하도록 구성되어 있지 않음을 나타냅니다. 서버를 라우터 뒤에두고 라우터의 공용 IP 주소를 사용하여 서버에 연결하려고하면 라우터가 포트 전달을 설정해야합니다.

방화벽이 거부하는 경우 이는 대개 요청한 포트가 열려 있지 않다는 의미입니다.

어느 쪽이든, 클라이언트가 코드에서 연결이 거부 된 이유를 알 수있는 방법이 없습니다. 일정 기간 동안 기다린 다음 다시 시도하십시오.