2011-09-06 3 views
0

UdpClient.Send (바이트 배열) 또는 UdpClient.Client.Send (스트림) 메서드를 사용하여 UDP 프로토콜 전체에서 데이터를 보낼 수 있습니다. 두 가지 방법 모두 작동합니다. 유일한 차이점은 하나의 메서드에서 바이트 배열을 전달하고 다른 메서드에서는 스트림을 전달한다는 것입니다.UdpClient.Send 메서드와 UdpClient.Client.Send 메서드 간의 차이점

빠른 예 :

UdpClient udpClient = new UdpClient(localEndPoint); 
// I can eather send data as: 
udpClient.Send(new byte[] { 0, 1, 2 }, 3); 
udpClient.Client.Send(new byte[5]); 

또한 어떤 방법을 내 데이터가 정보를 잃지 않고 목적지에의 도달하도록 할 것인가? 나는 udp 프로토콜이 모든 바이트가 목적지에 도달하는 것을 보장하지 않는다는 것을 읽었습니다. 따라서 스트리밍 비디오, 오디오는 좋지만, 제가하고있는 것처럼 파일을 전송하는 것은 아닙니다. 내가 tcp 대신에 udp를 사용하는 이유는 라우터 뒤에있는 두 사용자간에 tcp 연결을 설정하는 것이 매우 복잡하기 때문입니다. 사용자 중 한 명이 라우터에서 포트 포워딩을 사용할 수 있다면 가능할 것입니다. 나는 udp punch holing이라고 불리는 것을함으로써 데이터를 보낼 수있었습니다. udp punch holing을 사용하면 서버를 사용하여 라우터 뒤에있는 두 명의 사용자간에 연결을 설정할 수 있습니다. Google에서이 정보를 사용하면 많은 정보를 찾을 수있는 방법에 대해 설명하는 것이 오래 걸릴 것입니다. 어쨌든 난 그냥 왜 대신 UDP를 사용하고 있었는지 알려주고 싶었다. 데이터가 손실되지 않도록이 프로토콜로 파일을 보낼 수 있다면 지금은 안됩니다. 어쩌면 내가 알고리즘을 만들어야 해. 또는 UdpClient.Client.Send 메서드를 사용하면 데이터를받을 수 있고 UdpClient.Send 메서드로 데이터를받을 수 있는지 확인할 수 있습니다.

답변

1

UDP는 데이터 배달 또는 주문을 보장하지 않습니다. 패킷을 성공적으로 수신 한 경우에만 패킷이 완료되었음을 보증합니다. 자체 구현으로 네트워크 통신을 신뢰할 수 있도록해야합니다. 두 함수가 차이를 만들어서는 안됩니다.

UNIX Network Programming에는이 주제에 대한 장이 있습니다. (22.5 UDP 어플리케이션에 신뢰성 추가하기). NAT traversal 기능 (STUN 또는 릴레이 포함)과 통신의 신뢰성을 지원하는 libginble을 살펴볼 수도 있습니다.

이 문서의 Reliability and Flow Control은 구현 방법 중 하나를 이해하는 데 도움이 될 수 있습니다. 행운을 빕니다!

1

두 가지 방법간에 차이점이 없습니다. UdpClient는 Socket 주위의 래퍼입니다. UdpClient.Client는 UdpClient가 사용하고있는 Socket에 직접 액세스 할 수 있습니다. 둘 다 소켓을 통해 데이터를 전송합니다.

어느 누구도 모든 데이터가 수신된다는 것을 보장하지 않습니다. UDP는 1. 데이터가 전달 될 것이라는 보장을하지 않으며, 2. 전달 된 경우 순서대로 전달됩니다. 둘 다 필요하다면 (그리고 TCP를 사용할 수 없다면) 그 코드를 직접 작성해야합니다.

가장 간단한 프로토콜은 각 패킷에 시퀀스를 추가하는 것입니다. 서버가 하나의 패킷을 보내고 수신 한 클라이언트의 응답을 기다린 후 다음 패킷을 보냅니다. 서버에 대한 클라이언트의 응답이 손실되면 클라이언트가 서버에서 두 번 동일한 패킷을 수신 할 수 있으므로 시퀀스가 ​​중요합니다.

시퀀스 번호는 파일 크기의 현재 위치 (바이트 단위) 일 수 있습니다. 이는 TCP가 사용하는 것입니다.

안정성을 처리하는 데 사용되는 메커니즘을 이해할 수 있도록 TCP 프로토콜을 읽는 것이 좋습니다 (TCP와 UDP는 모두 IP에 기반합니다. TCP는보다 견고하고 (coplex) 프로토콜이므로 구현할 수 있습니다) 그것의 일부분)

+0

나는 TCP를 사용할 수 있으면 좋겠다. 나는 NAT 뒤에 두 사용자 사이의 TCP 연결을 설정할 수 없었습니다.나는 서버의 도움으로 udp punch holing을함으로써 udp로 그렇게 할 수 있었다. 어쩌면 나는 ftp와 같은 다른 프로토콜로 구멍 뚫기를 할 수있다. 내가 udp로하고 싶은 이유는 라우터에서 포트 포워딩을 사용하지 않고도 NAT를 통해 두 피어를 연결할 수있는 유일한 프로토콜이기 때문입니다. –

관련 문제