c++ udp 질문 있습니다.

꼬물의 이미지

MFC를 이용해 udp 통신하는 프로그램을 만들고 있는데요 ..

A 프로그램에서 for문으로 900byte 정도의 배열을 반복해서 보내고,
B 프로그램에서 그 데이터를 받아 그대로 다시 A 프로그램에 보내는 구조입니다.

여기서.. A 프로그램에서 Sendto한 횟수 만큼 B 프로그램에서 데이터를 받지 못하고 있는데
UDP 통신 할 때, Send를 너무 빨리하면 Recv 쪽에서 누락되어 유실되는 경우가 일반적인가요..?
아니면 B 프로그램에서도 bind를 통해 Recv를 대기하게 만들어야 할까요? (현재 B는 바인드 없이 작성한 코드라 Recv를 계속 리턴하고 있습니다..) 일주일 내내 찾아봤는데 Send 텀을 늘리는 것 말고는 어떤 다른 방법이 있는지 모르겠습니다..
데이터 보내는텀을 늘리면 실행시간이 너무 늘어나서.. 다른 방법이 없을까요?

jick의 이미지

UDP는 원래부터 패킷이 다른쪽에 100% 전달된다는 보장이 안됩니다. 그래서 어플리케이션 레벨에서 데이터가 유실됐는지 확인하고 다시 요청하든지 하는 로직을 짜넣어야 합니다.

그냥 TCP를 쓰시는 쪽이 여러 모로 편할 것 같은데요.

꼬물의 이미지

업체측에서 UDP 프로토콜을 사용하기로 해서 통신 방식을 바꿀 수는 없어요 ㅠㅠ...
디버깅 해보니 send 함수는 전부 거쳐가는 것 같은데 송신을 다 해도 recv 단 에서 못받을 수도 있는거죠?
흐름제어 코드 추가해서 보내려해도 안된다하니 어떡하라는건지 사실 잘 모르겠네요;ㅠㅠ.. 답변감사합니다..

익명 사용자의 이미지

해당 글 참고하시면 도움이 될 듯 합니다.
https://kldp.org/node/87600

라스코니의 이미지

보내는 쪽에서 보낼 때마다 약간의 딜레이를 넣으면 됩니다. 0.5ms 나 1ms 정도 넣어 보세요.
생각외로 송신 버퍼 양이 크지 않기 때문에 딜레이를 안넣고 루프 안에서 보내면 버퍼가 포화(saturation)되서 못보내는 패킷이 생겨요.

swish95의 이미지

TCP 는 당연히 문제가 안되겠지만 UDP는 당연 문제가 됩니다.

A 데이터 전송 -> B 데이터 수신 -> B 데이터 전송 -> A 데이터 수신
이런형태가 짧은 시간동안 많이 이뤄진다는 뜻이겠죠?

기본적으로 반이중 방식에서는
UDP 특성상 받는쪽 - 이상황에서는 AB 모두 - 을 고려하지 않고 다 보내버리게 됩니다.
그래서 데이터가 유실되는 상황이 생기게 되는거죠

반이중 방식에서는 UDP로 A -> B 로만 데이터 송신시에도 생각보다 많은 패킷을 주고 받기 때문에 유실은 생깁니다.
그런데 언급하신 양쪽모두 같은 방식의 UDP 데이터 송수신이 이루어지면 생각보다 많은 유실이 발생하게 됩니다.
양쪽 모두 주고 받아야 한다면 전이중 방식으로 네트워크 환경을 개선하는 방법이 가장 좋습니다.

만약 전이중 방식이 허용되는 네트워크라면 전이중 설정만으로 해결 되겠지만
반이중 방식이라면 그냥 무작정 보낼께 아니라 한번 보내고 한번 받고 이런식으로 처리되도록 하는게 최선일테고
딜레이를 준다고 하면 적당하게 처리 하면 되지만 이 또한 제가 언급한 방식과 다르지 않게 처리되도록 해야 될겁니다.

전이중 관련 참조 : https://m.blog.naver.com/PostView.nhn?blogId=hkuk1113&logNo=100062568040&proxyReferer=https:%2F%2Fwww.google.com%2F

------------------------------------------------------------
ProgrammingHolic

Anti-Lock의 이미지

초당 패킷의 전송 수와 패킷당 데이터 사이즈가 얼마나 됩니까?
B가 수신하지 못한 패킷의 비율을 얼마입니까?
B가 수신하고 재전송했는데 A가 받지 못한 비율이 얼마나됩니까? (이건 주요 관심사항은 아니군요)
B프로그램은 어떤 라이브러리를 사용했습니까.
MFC의 UDP클래스를 사용했습니까? 프로그램 구성상 GUI 이벤트 처리부분이
네트워크 송/수신에 영향을 줄만한 요소가 없습니까?

chanik의 이미지

B쪽에서 패킷캡처를 해 보시면 어떨까요 (스위치에서 포트미러링이 가능하다면 제3의 장비에서 캡처해볼 수도 있겠고요).

캡처시에도 패킷누락이 관찰된다면 A에서 소켓송신버퍼 오버런으로 미발송됐다고 보고, 소켓전송버퍼를 늘려보거나 데이터 송출빈도를 낮춰볼 수 있겠고,

캡처시엔 누락이 없는데 소켓에서 읽어낸 데이터엔 누락이 관찰된다면, 소켓에서 읽어내는 코드를 더 부지런히 동작하도록 개선하거나 소켓수신버퍼를 늘려보거나 송출빈도를 낮추는 등의 조치가 필요할 것입니다.

번거롭겠지만 A쪽에서도 캡처하여 B쪽의 결과와 대조해볼 수도 있을 것입니다. 캡처는 커널 내에서 이뤄지므로, send 이후에 커널에서 패킷들이 어떻게 만들어지고 recv 전에 커널에 패킷들이 어떤 모습으로 들어왔는지를 보여줍니다. 누락을 추적할 힌트가 생기겠죠.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.