2013-09-02 4 views
7

를 재설정 후에도 0을 반환 내가 작성 및 POSIX socket을 연결하고있어하는 아이 패드 응용 프로그램을 가지고있다. 원격 장치가 연결 시도를 거부하면 connect(...)에 대한 호출이 예상대로 응답하지 않습니다.소켓에 연결() 피어가

내가 만들고 연결하고있어 방법의 간단한 예는 socket : 대부분의 경우

struct sockaddr_in server; 
server.sin_family = AF_INET; 

int socket = socket(AF_INET, SOCK_STREAM, 0); 
if(socket < 0) 
{ 
    NSLog(@"socket create failed: %s", strerror(errno)); 
} 
else if(inet_aton(mAddress, &server.sin_addr)) 
{ 
    server.sin_port = htons(mPortNumber); 
    if(connect(socket, (struct sockaddr *)&server, sizeof(server)) == -1) 
    { 
    NSLog(@"connect() failed: %s", strerror(errno)); 
    } 
    else 
    { 
    NSLog(@"connect() succeeded"); 
    } 
} 

, 위의 예 작동 : 예를 연결을 수락하는 원격 장치 (이후 '서버'라고 함)의 경우 connect()은 예상대로 0을 반환합니다. 존재하지 않는 주소의 경우 잠시 동안 connect() 블록이 반환되고 -1이 반환되고 errnoETIMEDOUT이 반환됩니다. 서버가 연결 시도를 거부 할 경우 워드 프로세서

, 나는 ECONNREFUSED 혹은 ECONNRESET-1errno에 대한 반환 connect()을 기대. 대신 connect()0을 반환합니다.

나는 TCP 대화를 여러 번 WireSharked했고 오직 두 개의 패킷으로 구성되어 있음을 확인할 수 있습니다

:

클라이언트 (아이 패드) -> 서버 : SYN, ACK

서버 -> 클라이언트 (아이 패드) : RST, ACK

왜 반환 0를 연결합니까?

업데이트 : 다른 클라이언트에서 동일한 서버에 연결, 예를 들어, Windows (Winsock?) 또는 Mac OSX (posix)의 Qt는 예상대로 작동합니다. 즉 connect()-1, ECONNREFUSED을 반환합니다. 이것은 내가 서버 쪽보다는 아이 패드 쪽에서 문제라고 믿게한다.

+0

:

나는 당신이이 글을 읽을했지만, 노트 아이폰 OS에서 POSIX 소켓을 사용하여 더 많은주의가 있다고 가정 'reject '가 tcp/ip 연결 설정의 잘 정의 된 동작 interms인지 확실하지 않으므로, 어떻게 정의하는지 자세히 설명하고 싶을 것입니다. – alk

+0

'거절 된 연결'이 의미하는 것은 위와 같은 TCP 대화가있는 것입니다. 즉 클라이언트는 SYN으로 시도하고 서버는 'RST'로 답장합니다. 이것을 설명하기 위해 어떤 용어를 사용합니까? – sjwarner

+0

iPad의 SYN에 대한 리모컨의'SYN-ACK' 메시지가 표시되지 않습니까? – alk

답변

1

이 소켓을 만들어야한다고 생각합니다. 세 번째 매개 변수를 기록하십시오.

socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); 

결국 connect()는 거부 된 연결에 대해 0을 반환합니다. connect()가 성공했다면 tcp 연결이 설정되고 호출은 0을 반환한다고 가정 해 보겠습니다. 그러나 소켓에서 쓰기 또는 읽기를 호출하기 위해 코드가 변경되기 전에 서버가 즉시 재설정하거나 연결을 끊습니다. 다음 쓰기는 EPIPE로 실패하고 읽기는 0을 반환합니다. 어쨌든이 사건을 처리해야합니다. 난 "* ... 원격 장치가 연결 시도를 거부하는 경우 * ..."https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/CommonPitfalls/CommonPitfalls.html

관련 문제