다중 UDP 통신
글쓴이: zensjj / 작성시간: 화, 2023/03/28 - 10:01오전
안녕하십니까
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는 센서값을 잘 못 받는 것 같습니다.
이 통신을 꼭 성공하고 싶은데 찾아볼 사이트나 소스 또는 팁을 주시면 감사하겠습니다.
Forums:
_udpClient1와 _udpClient2는 각각
_udpClient1와 _udpClient2는 각각 다른 쓰레드로 돌고 있나요?
2개의 recvfrom()이 양쪽 소켓들로부터의 수신을 대기할 수 있도록 parallel로 돌고 있는 상황인가요?
아뇨 _udpClient1와 _udpClient2는
아뇨 _udpClient1와 _udpClient2는 둘다 한 쓰레드 안에서 recv하고 있습니다.
receive1 = _udpClient1.Receive(ref receivePoint1);
receive2 = _udpClient2.Receive(ref receivePoint2);
요 두 줄이 한 쓰레드 안에서 돌고있도록 했습니다. 병렬로 처리는 안했습니다.
Receive(recvfrom()과 같이 동작하겠죠?
Receive(recvfrom()과 같이 동작하겠죠?) 함수가 데이터가 들어올때까지 대기하는 방식(blocking)으로 동작한다면 위와 같이 같은 쓰레드로 돌기 위해서는 굉장히 정확하게 동기화된 ping-pong 동작이 발생해야 합니다. 사실상 어렵고 권장되지 않는 방법이고요.
해결은
1. 2개의 쓰레드를 두고 각각의 쓰레드에서 한가지 소켓 처리만 하는 방법. 권장되지만 각각의 소켓에서 받은 데이터를 처리하는 과정에서 뮤텍스(mutex)와 시그널(signaling)과 같은 처리가 필요.
2. Receive()를 non-blocking으로 처리하는 방법. 간편할수도 있지만 CPU 리소스의 부담이 단점.
도움이 되었길 바랍니다.
감사합니다 결국 같은 쓰레드 안에서 모두 받으려고
감사합니다 결국 같은 쓰레드 안에서 모두 받으려고 해서 생겼던 문제였습니다.
쓰레드를 각각 돌려서 병렬로 값을 받으니 해결했습니다!
다시 한번 감사드립니다.
UDP 통신을 사용하여 여러 기기와 통신하는 데
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)
이 문제를 해결하는 데 도움이 되길 바랍니다. 문제가 계속되면 추가적인 정보를 제공해 주시면 좀 더 구체적인 도움을 드릴 수 있습니다.
감사합니다 결국 같은 쓰레드 안에서 모두 받으려고
감사합니다 결국 같은 쓰레드 안에서 모두 받으려고 해서 생겼던 문제였습니다.
쓰레드를 각각 돌려서 병렬로 값을 받으니 해결했습니다!
다시 한번 감사드립니다.
해당 답변은 올려주신 질문에 대한 chatgpt 의
해당 답변은 올려주신 질문에 대한 chatgpt 의 답변이었습니다. 답변 중 3번의 이야기와 관련이 있는 것도 같고, 도움이 되는 답변이었는지 잘 모르겠네요.
댓글 달기