2017-01-05 22 views
0

비동기 호출을 사용하여 TCP 클라이언트를 작성하고 있습니다. 앱이 시작될 때 서버가 활성화되어 있으면 서버가 연결되어 대화를 나갑니다. 그러나 첫 번째 연결이 실패하면 connect()에 대한 모든 후속 호출은 네트워크 트래픽을 생성하지 않고 WSAENOTCONN (10057)으로 실패합니다 (Wireshark로 확인).TCP 소켓 연결 실패 후 올바른 절차는 무엇입니까?

현재 오류가 발생하면 코드가 소켓을 닫지 않습니다. TCP 상태 다이어그램에는 TCP 상태 도표가 필요하지 않습니다. 단지 30 초 동안 대기하고 connect()를 다시 시도합니다.

후속 connect() 및 다음 read() 모두 WSAENOTCONN 오류를 반환합니다.

소켓을 닫고 새 소켓을 열어야합니까? 그렇다면 어떤 오류가 소켓을 닫아야합니까? 다른 오류가 많기 때문에 테스트 벤치에서 볼 수 없을 것입니다.

실제적으로 Interval Zero RTX 2009이지만 일부 지역에서는 약간 다르지만 MS Winsock2라고 가정 할 수 있습니다.

+0

WSAENOTCONN은 'connect()'에 대한 문서화 된 오류 코드가 아닙니다. –

답변

0

소켓을 닫고 새 소켓을 열어야합니까?

예.

당신은 (예를 들어, 피어가 폐쇄했다처럼 연결) 영원히 사라 관련하여 발생하는 모든 오류 조건에서 소켓을 닫아야합니다

+0

연결을 닫는 피어가 오류가 아닙니다. – EJP

+0

@EJP : 아니요.하지만 연결이 끊어졌으며 소켓을 닫아야합니다. –

1

내가 소켓을 해지하고 새로해야합니까?

예.

그렇다면 오류를 많이 발생시키기 때문에 어떤 오류가 발생합니까? 그 중 일부는 테스트 벤치에서 볼 수 없을 것입니다.

거의 모든 오류가 연결에 치명적이며 소켓을 닫아야합니다. EAGAIN/EWOULDBLOCK은 EINTR과 마찬가지로 눈에 띄는 예외이지만, 다른 모든 것을 공개적으로 생각할 수는 없습니다.

+0

EINVAL은 연결과 EBADF에도 치명적이지는 않지만 두 경우 모두 소프트웨어 버그를 나타내므로 거의 확실하게 프로그램을 계속 진행할 수 없습니다. – EJP

+0

Winsock [documentation] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms737625.aspx)에 따르면 : "* 반환 된 오류 코드가 연결 시도가 실패했음을 나타내는 경우 (즉, WSAECONNREFUSED , WSAENETUNREACH, WSAETIMEDOUT) ** 응용 프로그램은 동일한 소켓 **에 대해 다시 connect를 호출 할 수 있습니다. ** "나는 그렇게하지 않을 것이다. ** 연결 관련 ** 오류가 발생할 때 소켓을 닫고 다시 만드는 것이 가장 좋습니다. –

+0

@RemyLebeau 동의 함. Winsock-ism은 BSD 또는 Linux 구현에서 BSD 소켓에서 작동하지 않습니다. – EJP