socket의 recvfrom 관련 질문입니다.

ssul97의 이미지

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;
}

이 함수가 뭐가 잘못된 것이 있을까요?
제 생각엔 패킷을 어디선가 일부분 놓치는 것 같은데..
혹시 비슷한 경험하신 분이나 관련 내용에 대해 도움이
될 만한 지식을 아시는 분 계시면 답변 부탁드립니다.
좋은 하루 되세요

kslee80의 이미지

recvfrom 이라면 UDP socket 이겠군요.

UDP 가 TCP 와는 틀리게 데이타가 손실될 수 있는 프로토콜이고..
그리고, UDP 소켓상에서 패킷 loss 가 나는 경우, 이는 소프트웨어에서 감지할 수 없습니다.
(패킷 내용 자체에 sequence number 같은 것을 넣어서 확인하는 방법을 쓴다면
가능하죠)
즉, UDP 패킷이 loss 되었다고 해서 recvfrom() 에서 에러를 리턴한다거나 하지 않고
그냥 loss 되지 않은 패킷이 도착할때까지 기다립니다.
select() 나 poll() 에서도 fd 에 아무런 반응이 없죠.

lovemyin의 이미지

UNP 책을 보시면 신뢰성 있는 UDP 프로토콜에 대한 예제가 있습니다. 윗분께서 말씀하셨듯이 UDP는 신뢰성을 보장하지 않기때문에 많은 데이터가 몰려올 경우에 데이터가 손실될 확률이 높습니다.
특히 스트리밍같은 경우 엄청난 데이터를 계속적으로 전송하기때문에 데이타 손실이 있을 것 같습니다. 데이터는 하단에서 버리기때문에 상위에서는 데이터를 복구할 방법이 없으므로 양단간의 신뢰성을 구축할 수 있는 설계가 필요합니다.

/***************************************************
* 가장 심플한 것이 가장 아름다운 것이다.
***************************************************/

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.