2011-01-26 6 views
1

winsock의 send() 또는 WSASend()를 사용하여 보낸 데이터가 실제로 대상에 전달되는지 여부를 확인하는 방법이 있습니까?send() 데이터 전달 보장

타사 서버와 대화하는 응용 프로그램을 작성 중입니다. 일부 시간 동안 작업 한 후 가끔씩 중단되고 해당 서버로 보낸 메시지가 배달되는지 여부를 확인해야합니다. 문제는 서버가 이미 다운 된 경우에도 send()를 오류없이 완료하는 경우가 있으며 다음 send() 만 오류가 발생하기 때문에 이전 메시지가 전달되었는지 잘 모릅니다.

전송 된 특정 (또는 전체) 패킷이 acked인지 여부는 정보가 있지만 소켓 인터페이스를 사용하여 사용할 수 없거나 길을 찾을 수 없다고 가정합니다.

최악의 경우, 서버의 코드를 변경할 수 없어 배달 확인 메시지를받을 수 없습니다.

답변

0

미안하지만 달성하려는 목표에 따라 TCP 스택이 원격 TCP 스택에 의해 특정 바이트 세트가 ACK되었음을 표시 할 수 있다고하더라도 실제로 당신이 아는 것과 다른 것을 의미하지는 않습니다.

문제는 원격 응용 프로그램이 보낸 응용 프로그램 수준의 ACK를 응용 프로그램 수준에서 보내면 원격 응용 프로그램이 보낸 데이터를 처리 한 경우에만 데이터가 수신되었는지 여부를 알 수 없다는 것입니다 원격 응용 프로그램에 의해.

'하지만 나는 그것의 가까운 충분히 가정 할 수있다'

은 망상이다. 귀하의 전송이 유효하다는 사실을 알게되면 귀하는 그러한 가정을 할 수 있습니다.

문제는 TCP 스택이 원격 스택이 데이터 (2)를 수신하는 원격 응용 프로그램과 동일하지 않은 데이터 (1)를 ACK했다는 것을 알 수 있지만 그것이 동일하지 않다는 것입니다 원격 응용 프로그램으로 실제로 데이터를 사용하는 것 (3).

원격 응용 프로그램이 임의의 지점에서 충돌 할 수 있다고 가정 할 때 1, 2 또는 3은 데이터가 도착했다는 유일한 표시입니다. 의도 한 용도로 데이터를 사용한 후 원격 응용 프로그램에서 보낸 것입니다.

다른 모든 것은 단지 희망적인 생각입니다.

+0

나는 그 망상을 알고 있지만,이 상황에서는 응용 프로그램 수준에서 불만을 갖기가 불가능합니다.어떤 점에서 TCP 스택은 프로토콜 수준에서 원격 확인에 대한 표시를 줄 수 있습니까? – miara

+0

그것은 망상적이기 때문에, 그것이 단지 가지고있는 척하지 않는 이유는 ... –

0

보낼 수 없습니다(). 모든 send()는 데이터가 송신 버퍼로 푸시되었음을 나타냅니다. 연결된 소켓 스트림은 모든 데이터를 전송할 의무가 없으며 데이터가 순서대로 전송됩니다. 따라서 send()가 단일 패킷으로 수행되거나 네트워크 지연 또는 인터럽트로 인해 발생한다고 가정 할 수 없습니다.

전체 승인이 필요하면 응용 프로그램 수준 확인 (서버가 패킷 ACK가 아닌 서식이 지정된 확인 메시지를 보내야 함)을 확인해야합니다.

+0

TCP 프로토콜에는 ack가 있으므로 TCP 레이어는 다른 쪽이 보낸 메시지의 주어진 부분을 받았는지 정확히 알 수 있습니다.이 정보를 얻을 수있는 옵션이 없습니까? 나는 다른 TCP 스택에 의한 전체 메시지를 읽는 것이 애플리케이션을 읽고 처리하는 것을 의미하지는 않는다는 것을 알고 있지만, 충분히 근접하다고 생각할 수있다. 타사 서버로 응용 프로그램 프로토콜을 수정할 수 없습니다. – miara

+0

그 정보는 API에 다시 전파되지 않으며, 당신이 말했듯이 서버가 그것의 버퍼를 읽어서 그것을 처리했다는 것을 의미하지는 않습니다. – CoreyStup