2012-04-25 4 views
2

무슨 일이 일어나는지 이해하지 못합니다. localhost ("localhost", "127.0.0.1"또는 컴퓨터의 외부 IP) 이외의 다른 곳으로 소켓을 만들면 올바르게 작동합니다. 만약 그 포트를 들으면서 무언가없이 주소에 대한 소켓을 만들면 10060 (타임 아웃)을 얻지 만 10061은 이해할 수 없습니다. localhost에 갈 때 연결이 거부되는 이유는 무엇입니까? 방금 ​​방화벽이 작동하지 않는 경우를 대비해 시도했지만, 그렇지 않습니다.Winsock은 로컬 호스트에만 연결하면 10061을 반환합니다

전에 모든 WSA 초기화 작업을 수행하고 있습니다.

_socketToServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
    if(_socketToServer == -1){ 
    return false; 
    } 

    p_int = (int*)malloc(sizeof(int)); 
    *p_int = 1; 
    if((setsockopt(_socketToServer, SOL_SOCKET, SO_REUSEADDR, 
     (char*)p_int, sizeof(int)) == -1)|| 
     (setsockopt(_socketToServer, SOL_SOCKET, SO_KEEPALIVE, (char*)p_int, 
       sizeof(int)) == -1)){ 
     free(p_int); 
     return false; 
    } 
    free(p_int); 


    struct sockaddr_in my_addr; 

    my_addr.sin_family = AF_INET ; 
    my_addr.sin_port = htons(_serverPort); 

    memset(&(my_addr.sin_zero), 0, 8); 
    my_addr.sin_addr.s_addr = inet_addr(_serverIP); 


    if(connect(_socketToServer, (struct sockaddr*)&my_addr, sizeof(my_addr)) 
     == SOCKET_ERROR){ 
    DWORD error = GetLastError(); //here is where I get the 10061 
    return false; 
} 

아이디어가 있으십니까?

+0

방화벽이나 맬웨어 방지 프로그램처럼 들립니다. 포트에서 수신 대기중인 프로그램을 실제로 실행하고 있습니까? –

+0

포트 번호는 무엇입니까? 10060을 받기를 기대합니까, 아니면 실제로 연결하고 싶습니까? – marcinj

+0

나는 9001,9002 ... 9033을 시도했다. 그들 중 누구도 일하지 않았습니다. 나는 듣고있는 프로그램을 가지고 있지만 같은 결과를 얻지는 않더라도. 원격 클라이언트에서 작동합니다. 실제로 테스트하기 위해, 나는 동일한 기계 내에서 퍼티를 통해 포트를 열어 보았습니다. 그리고 나는 연결을 시작할 수 있습니다! (서버 코드는 자동으로 데이터를 보내고, 터미널에서 볼 수있는 데이터입니다.) 나는 매우 혼란 스럽다 – cloudraven

답변

4

다른 컴퓨터의 수신 대기 포트에 연결하지 않을 경우 WSAETIMEDOUT 오류가 발생한다고 보장 할 수 없습니다. 임의의 수의 다른 오류가 발생할 수 있습니다. 그러나 connect() 시간이 초과되기 전에 소켓이 대상 컴퓨터에 도달 할 수없는 경우에만 WSAETIMEDOUT 오류가 발생합니다. 대상 컴퓨터에 도달 할 수있는 경우 WSAECONNREFUSED 오류는 대상 컴퓨터가 connect() 요청을 승인하고 요청한 포트가 수신 중이 지 않거나 백 로그가 꽉 찼기 때문에 요청한 포트가 그 당시 연결을 수락 할 수 없다고 회답 함을 의미합니다 어떤 것을 구별 할 방법이 없는지). 따라서 로컬 호스트에 연결할 때 동일한 시스템에 연결하고 포트의 수신 대기 상태를 확인하는 데 지연이 없으므로 수신 대기가 아닌 포트에 연결할 때 거의 항상 WSAECONNREFUSED 오류가 발생합니다. 방화벽이나 안티 멀웨어와는 아무 관련이 없습니다. 이것은 정상적인 동작입니다.

+0

고마워. 실제로 그것을 아는 것은 매우 유용합니다. 포트와 상관없이 동일한 오류 메시지가 표시되어 혼란스러워졌습니다. 결국 문제는 재부팅으로 해결되었습니다. 나는 서버 소켓이 정말로 가까이에 없다고 생각한다. 나는 그것을 일찍 시도해야했다. – cloudraven

+2

백 로그가 가득 차면 Windows 서버에서만 ECONN/WSAECONNREFUSED가 발생합니다. 유닉스와 리눅스 서버는 타임 아웃을 일으킨다. – EJP

관련 문제