다중 UDP 통신

zensjj의 이미지

안녕하십니까

Unity와 C 그리고 다른 기기에서 보내는 신호까지 동시에 3곳에서 UDP 통신을 해야하는 상황입니다.

요약하자면

센서값 -> Unity <-> C (센서는 Unity로 보내기만, Unity와 C는 서로 값 주고 받기)

이렇게 통신 중인데

처음 UDP 통신을 만드는데 2개도 겨우 했는데 3개를 동시에 하려니 잘 안됩니다.

일단 Unity에서

_udpClient1 = new UdpClient(1470); // 센서값 받는 포트
_udpClient2 = new UdpClient(1471); // C와 통신하는 포트

이렇게 포트 2개 만들고 통신하고 있는데 C와 Unity는 통신이 잘 되는데
Unity는 센서값을 잘 못 받는 것 같습니다.

이 통신을 꼭 성공하고 싶은데 찾아볼 사이트나 소스 또는 팁을 주시면 감사하겠습니다.

라스코니의 이미지

_udpClient1와 _udpClient2는 각각 다른 쓰레드로 돌고 있나요?
2개의 recvfrom()이 양쪽 소켓들로부터의 수신을 대기할 수 있도록 parallel로 돌고 있는 상황인가요?

zensjj의 이미지

아뇨 _udpClient1와 _udpClient2는 둘다 한 쓰레드 안에서 recv하고 있습니다.

receive1 = _udpClient1.Receive(ref receivePoint1);
receive2 = _udpClient2.Receive(ref receivePoint2);

요 두 줄이 한 쓰레드 안에서 돌고있도록 했습니다. 병렬로 처리는 안했습니다.

라스코니의 이미지

Receive(recvfrom()과 같이 동작하겠죠?) 함수가 데이터가 들어올때까지 대기하는 방식(blocking)으로 동작한다면 위와 같이 같은 쓰레드로 돌기 위해서는 굉장히 정확하게 동기화된 ping-pong 동작이 발생해야 합니다. 사실상 어렵고 권장되지 않는 방법이고요.

해결은
1. 2개의 쓰레드를 두고 각각의 쓰레드에서 한가지 소켓 처리만 하는 방법. 권장되지만 각각의 소켓에서 받은 데이터를 처리하는 과정에서 뮤텍스(mutex)와 시그널(signaling)과 같은 처리가 필요.

2. Receive()를 non-blocking으로 처리하는 방법. 간편할수도 있지만 CPU 리소스의 부담이 단점.

도움이 되었길 바랍니다.

zensjj의 이미지

감사합니다 결국 같은 쓰레드 안에서 모두 받으려고 해서 생겼던 문제였습니다.
쓰레드를 각각 돌려서 병렬로 값을 받으니 해결했습니다!
다시 한번 감사드립니다.

익명 사용자의 이미지

UDP 통신을 사용하여 여러 기기와 통신하는 데 문제가 있다고 이해했습니다. 세 가지 기기 중에서 Unity와 C는 서로 통신이 잘 되지만, Unity가 센서값을 제대로 받지 못하고 있습니다.

이 문제를 해결하기 위해 다음 사항들을 확인해보세요.
1. IP 주소와 포트 번호 확인
센서와 Unity 사이에서 통신할 때 사용하는 IP 주소와 포트 번호가 정확한지 확인하세요. 예를 들어, 센서가 데이터를 보내는 IP 주소와 포트가 Unity에서 사용하는 IP 주소와 포트와 일치해야 합니다.
2. 센서의 데이터 전송 확인
센서가 데이터를 정상적으로 전송하고 있는지 확인해보세요. 가능하다면, 센서의 데이터 전송을 모니터링하거나 디버깅하여 문제가 없는지 확인하세요.
3. Unity에서 비동기 처리
Unity에서 동시에 여러 UDP 통신을 처리하려면 비동기 처리가 필요합니다. `async`와 `await` 키워드를 사용하여 비동기 처리를 구현하고, 각각의 통신을 독립적으로 처리할 수 있게 하세요.

예시:

```csharp
private async void ReceiveData1()
{
while (true)
{
UdpReceiveResult result = await _udpClient1.ReceiveAsync();
// 데이터 처리
}
}

private async void ReceiveData2()
{
while (true)
{
UdpReceiveResult result = await _udpClient2.ReceiveAsync();
// 데이터 처리
}
}
```


1. 패킷 손실 확인
UDP는 연결이 없는 프로토콜이므로 패킷 손실이 발생할 수 있습니다. 패킷 손실이 있는지 확인하고, 패킷 손실이 발생한다면 이를 해결할 방법을 찾아보세요. 예를 들어, 네트워크 환경을 개선하거나 패킷 재전송 메커니즘을 구현할 수 있습니다.
2. 참고 자료
다음 자료들을 참고하여 Unity와 C를 사용한 UDP 통신에 대한 정보를 얻을 수 있습니다:
- Unity 공식 문서: [https://docs.unity3d.com/Manual/UNetUsingTransport.html](https://docs.unity3d.com/Manual/UNetUsingTransport.html)
- Unity와 C#을 이용한 UDP 통신 예제: [https://github.com/nxrighthere/ValveSockets-CSharp](https://github.com/nxrighthere/ValveSockets-CSharp)

이 문제를 해결하는 데 도움이 되길 바랍니다. 문제가 계속되면 추가적인 정보를 제공해 주시면 좀 더 구체적인 도움을 드릴 수 있습니다.

zensjj의 이미지

감사합니다 결국 같은 쓰레드 안에서 모두 받으려고 해서 생겼던 문제였습니다.
쓰레드를 각각 돌려서 병렬로 값을 받으니 해결했습니다!
다시 한번 감사드립니다.

익명 사용자의 이미지

해당 답변은 올려주신 질문에 대한 chatgpt 의 답변이었습니다. 답변 중 3번의 이야기와 관련이 있는 것도 같고, 도움이 되는 답변이었는지 잘 모르겠네요.

댓글 달기

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