socket의 recvfrom 관련 질문입니다.
socket의 recvfrom을 이용해서 내트웍으로부터
스트림을 받아와 재생하는 작업을 하고 있습니다.
스트림을 디코딩하는 것은 칩에서 지원하고 받아온 패킷을
단순히 push하기만 하면 되는 작업이고, 디코더 칩 테스트
프로그램으로 이상없이 동작되는 것을 확인하였습니다.
그런데 제 함수로 받다보면 장시간 플레이시 화면이
1~2회 정도 끊깁니다. 테스트 프로그램은 안 그런데..
다음은 받는 루틴입니다.
#define MSEC_TIMEOUT 100 // 500
int RecvFrom(unsigned char *Data, int Len)
{
if (m_ErrorOccured)
return -1
int len;
struct pollfd pfd;
pfd.fd = m_Sockfd;
pfd.events = POLLIN | POLLPRI;
if (poll(&pfd, 1, MSEC_TIMEOUT) <= 0)
len = -1
else {
if (pfd.revents & (POLLIN | POLLPRI))
len = recvfrom(m_Sockfd, Data, Len, MSG_WAITALL, NULL, NULL);
else
len = SOCKET_ERROR;
}
return len;
}
이 함수가 뭐가 잘못된 것이 있을까요?
제 생각엔 패킷을 어디선가 일부분 놓치는 것 같은데..
혹시 비슷한 경험하신 분이나 관련 내용에 대해 도움이
될 만한 지식을 아시는 분 계시면 답변 부탁드립니다.
좋은 하루 되세요
recvfrom 이라면 UDP socket 이겠군요.UDP 가 T
recvfrom 이라면 UDP socket 이겠군요.
UDP 가 TCP 와는 틀리게 데이타가 손실될 수 있는 프로토콜이고..
그리고, UDP 소켓상에서 패킷 loss 가 나는 경우, 이는 소프트웨어에서 감지할 수 없습니다.
(패킷 내용 자체에 sequence number 같은 것을 넣어서 확인하는 방법을 쓴다면
가능하죠)
즉, UDP 패킷이 loss 되었다고 해서 recvfrom() 에서 에러를 리턴한다거나 하지 않고
그냥 loss 되지 않은 패킷이 도착할때까지 기다립니다.
select() 나 poll() 에서도 fd 에 아무런 반응이 없죠.
신뢰성 있는 UDP 구축
UNP 책을 보시면 신뢰성 있는 UDP 프로토콜에 대한 예제가 있습니다. 윗분께서 말씀하셨듯이 UDP는 신뢰성을 보장하지 않기때문에 많은 데이터가 몰려올 경우에 데이터가 손실될 확률이 높습니다.
특히 스트리밍같은 경우 엄청난 데이터를 계속적으로 전송하기때문에 데이타 손실이 있을 것 같습니다. 데이터는 하단에서 버리기때문에 상위에서는 데이터를 복구할 방법이 없으므로 양단간의 신뢰성을 구축할 수 있는 설계가 필요합니다.
/***************************************************
* 가장 심플한 것이 가장 아름다운 것이다.
***************************************************/
댓글 달기