2012-08-11 6 views
0

을 ENOENT 설정으로이 코드가 :의 IP가 FFFF :: 설정의 IPv6와버클리 소켓 (연결)는 -1을 반환 errno는이

bool CBSocketConnect(uint64_t socketID,uint8_t * IP,bool IPv6,uint16_t port){ 
    // Create sockaddr_in6 information for a IPv6 address 
    int res; 
    if (IPv6) { 
     struct sockaddr_in6 address; 
     memset(&address, 0, sizeof(address)); // Clear structure. 
     address.sin6_family = AF_INET6; 
     memcpy(&address.sin6_addr, IP, 16); // Move IP address into place. 
     address.sin6_port = htons(port); // Port number to network order 
     res = connect((evutil_socket_t)socketID, (struct sockaddr *)&address, sizeof(address)); 
    }else{ 
     struct sockaddr_in address; 
     memset(&address, 0, sizeof(address)); // Clear structure. 
     address.sin_family = AF_INET; 
     memcpy(&address.sin_addr, IP + 12, 4); // Move IP address into place. Last 4 bytes for IPv4. 
     address.sin_port = htons(port); // Port number to network order 
     res = connect((evutil_socket_t)socketID, (struct sockaddr *)&address, sizeof(address)); 
    } 
    if (NOT res || errno == EINPROGRESS) 
     return true; 
    return false; 
} 

가 false로 설정을 : 127.0.0.1을 (IPv4의 루프백 주소)이고 포트 번호가 45562로 설정되면, res는 -1로 설정되고 errno는 ENOENT (2)로 설정됩니다. 왜 이럴 수 있니?

내가 사용하는 플랫폼은 OSX Mountain Lion입니다. libevent 버전 "2.0.19-stable"이있는 소켓을 사용하고 있습니다.

감사합니다.

+0

TCP를 사용하여 서버에 연결하는 클라이언트의 일반적인 순서는 socket() 호출을 먼저 수행하여 소켓을 얻은 다음 connect() 호출을 사용하여 소켓을 사용하여 서버에 대한 연결을 생성하는 것입니다 socket()에서 얻은 핸들. 좋은 소켓 핸들이 있습니까? –

+0

소켓은 다른 곳에서 만들어지고 문제없이 생성됩니다. –

+0

또한 연결 호출 후에 errno를 확인합니다. 내 프로그램은 멀티 스레드지만, 올바르게 기억한다면 errno는 POSIX 표준으로 멀티 스레드 프로그램에서 작동하도록 설계되었습니다. –

답변

0

나는 문제를 발견 LLDB

LLDB 내게 말하고 있었다 errno를했다 ENOENT 그러나 나는 (I 명확하게 정상적으로) GDB를 사용할 때의 errno는 EINPROGRESS 하더군요! 모두 괜찮 았어. 그것은 모든 디버거의 잘못이었습니다.

학습 : GDB를 사용하고 절대 LLDB를 사용하지 마십시오.