2012-07-30 3 views
0

매우 짧은 시간에 서버에 몇 초마다 패킷을 전송해야하는 응용 프로그램을 구현해야했습니다. 서버가 패킷을 수신하면 클라이언트에 응답을 보내고 다른 패킷을 보냈습니다. 이 모든 것은 좋지만 우리는 TCP를 사용하고 있었고 응답은 서버가 패킷을 받았을 때와 후 처리가 아닌 것처럼 보였습니다. 그래서 저에게 이상하게 여깁니다. 왜 이렇게 하시겠습니까? 가 성공적으로 보낼 경우에만 TCP에서 유효성 검사가 필요합니까?

try { 
    send packet // exception is thrown if connection is lost 
    remove packet from queue 
} catch exception { 
    try to reconnect 
} 

그래서이 경우에는 패킷이 큐에서 제거됩니다 : 클라이언트는 내가 모든 패킷을 보관하고 이런 일을 한 큐를했다.

이것에 대한 아이디어가 있으십니까? 이게 최선의 관행인가? 누군가가 나를 위해 이걸 지울 수 있다면 고맙겠습니다.

감사합니다.

+0

Q : 무엇이 당신의 질문입니까? 대기열을 유지하는 것보다 "발사하고 잊어 버리는"것이 더 낫겠습니까? A : 가능합니다. TCP 대신 UDP를 사용하는 것이 더 낫습니다 (대기열을 유지하고 있고 재 시도를 관리하는 한)? A : 가능합니다. 어떤 종류의 "ACK"없이 "보내기"오류를 감지하는 것이 문제가됩니까? A : 네. 이 (잠재적 인) 질문 중 하나에 대한 대답은 "다릅니다"입니다. ;) IMHO ... – paulsm4

+0

TCP는 전송 및 주문을 보장합니다. 따라서 UDP를 사용하면 주문을 잃을 수 있으므로 직접 다시 주문하고 조각을해야합니다. –

+0

연결이 작동 중임을 알아야하는 경우 TCP_KEEPALIVE라는 옵션이 있습니다.이 옵션은 패킷을 보내 연결 상태를 유지하고 패킷이 유실 된 경우 시간을 초과하도록합니다. 이것은 자연스럽게 다른 쪽 끝의 소프트웨어 TCP 연결이 아직 살아 있는지 확인합니다. –

답변

1

경우에 따라 송신이 충분하지 않습니다. 문을 밀고 나가야하는 데이터가 반드시 수신되어야한다는 것이 절대적으로 중요하다면 패킷이 원격 장치에 의해 수신/처리되었다는 확인을 기다려야합니다.

네트워크 수준의 항목이 완벽하게 작동하고 패킷이 대상에 도착하더라도 해당 대상 컴퓨터가 여전히 충돌하거나 데이터를 잃을 수 있습니다. 전송시 삭제하면 해당 데이터가 사라집니다. 원격 장치로부터 수신 확인을 기다리면 손상되거나 손실 된 패킷을 재전송 할 수 있습니다.

+0

서버가 중단되고 연결이 살아있을 가능성이 있다고 생각합니까? 어쩌면 그것이 어떻게 든 스레드에서 개최된다면? – Bogdan

+0

소프트웨어가 고장 나거나 죽지 않을 수 있습니다. 예를 들어, 교착 상태 일 수 있습니다. –

+0

당신이 옳습니다. 나는 매우 순진한 관점에서 이것을 보았다. 귀하의 통찰력에 감사드립니다. – Bogdan

1

하나의 옵션은 패킷을 대기열에 넣고 전송하는 것입니다. 전송 후 "보류 중"대기열로 이동합니다. 다른 쪽 끝이 으로 처리되고으로 처리되면 완료로 표시합니다. 그런 다음 다른 문제에 반대합니다. 상대방이 처리하지만 Ack가 끝까지 도달하지 못하면 어떨까요? 이것은 상대적으로 연구 된 문제이며 확실한 경우 분산 트랜잭션과 2 단계 커밋을 연구하는 것이 좋습니다.

+0

멋진 아이디어입니다. 감사 :) – Bogdan

관련 문제