2013-09-01 2 views
0

.NET에서 udp 소켓을 사용하고 있는데 특히 udp 소켓으로 그림 상자에서 다른 프로그램으로 이미지를 보내는 프로그램을 만들었습니다. UDP 소켓 C# .NET

코드이다

이 소켓 포트로부터 이미지를 수신하는 수신기 부분 (8000)

private void Listening() 
     { 
      IPEndPoint ipep = new IPEndPoint(IPAddress.Loopback, 8000); 

      Socket newsock = new Socket(AddressFamily.InterNetwork, 
          SocketType.Dgram, ProtocolType.Udp); 

      newsock.Bind(ipep); 


      int recv; 
      IPEndPoint sender1 = new IPEndPoint(IPAddress.Parse("192.168.1.1"), 6000); 

      EndPoint Remote = (EndPoint)sender1; 
      byte[] data = new byte[11230]; 


      recv = newsock.ReceiveFrom(data,ref Remote); 

      MemoryStream x = new MemoryStream(data); 

      Image y = Image.FromStream(x); 

      pictureBox2.Image = y; 

     } 

이 소켓 화상 [코드]

private void Sending() 
     { 
      IPAddress host = IPAddress.Parse("127.0.0.1"); 
      IPEndPoint hostep = new IPEndPoint(host, 8000); 
      Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 

      sock.Connect(hostep); 


      MemoryStream ms = new MemoryStream(); 

      pictureBox1.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); 

      sock.Send(ms.ToArray()); 

      } 
를 전송하는 전송 부이고

두 부품이 동일한 PC에 있습니다.

내 문제는이 호출 때 예외 오순절이 메시지를 생성하는 "보내기"일부 기능을 "보내기"입니다 :

"데이터 그램 소켓에 보낸 메시지의 크기가 내부 메시지 버퍼보다 ​​큰 경우 또는 다른 네트워크 제한, 또는 데이터 그램의 수신 버퍼의 크기는

+1

UDP를 사용하지 마십시오. 진지하게. ** 당신이 정말로 * 필요로하는 UDP를 안다면, 사용하지 마십시오. –

+0

오류 메시지가 분명합니다 : 보내려는 데이터의 양이 UDP에 비해 너무 큽니다. 그 외에도, 코드에는 많은 문제가 있으므로 @JonathonReinhart가 말한 것에 +1합니다. – dtb

+0

@dtb TCP 대신 UDP를 선택하는 경우를 제외하고는 무엇이 오류입니까? –

답변

0

오류 메시지가 꽤 straitforward 인 데이터 그램 자체 "시간에 대한

감사보다 낮은 : 당신은 메시지의 한계를 초과하는 크기. UDP에서는 바이트 스트림이 아닌 데이터 그램을 보냅니다. IPv4에서는 65507 바이트 (즉, IPv4 및 UDP 헤더를 포함하여 64KiB)보다 큰 UDP 데이터 그램을 보낼 수 없습니다.

UDP는 짧은 메시지를 전달하는 데 적합하지만 많은 양의 데이터를 전송하는 데 TCP가 더 적합합니다.

+0

안녕하세요,이 예입니다.하지만 실제로 웹캠에서 프레임을 보내야합니다. 보내는 방법을 만드는 방법은 무엇입니까? TCP를 사용하지 않습니다. 속도가 느리고이 범위에서는 바람직하지 않습니다. –

+0

@alessiovinaccia Ohhh ... 스트리밍 웹캠 피드입니다. 보시다시피, 처음부터 제공 했어야 할 엄청난 정보입니다. 이 경우 대답은 간단합니다. ** [RTP] (http://en.wikipedia.org/wiki/Real-time_Transport_Protocol) **를 사용하십시오. –

+0

3 가지 질문이 있습니다. 1) UDP 프로토콜에 대한 이해에서 패킷 단편화가 허용되지 않으며 패킷이 한 번에 전송 되었기 때문에 길이 제한이 있습니다. 단, TCP는 단편화가 가능하며 길이 제한이 없습니다. .맞아? 2) RTP C# 라이브러리는 어디서 다운로드해야합니까? 3) 나는 RTP에 관한 문서를 읽고 RTP에는 패킷 (정렬, 오류 ...)에 대한 다양한 제어가 있다고한다. 나의 질문은 : 왜 그것의 프로토콜이 UDP의 프로토콜 인 –

1

나는 당신의 현재 접근 방식에 대해 조언 할 것입니다. 당신이 성취하려고 시도하는 것은 견고한 방식으로 성취하기가 그렇게 간단하지 않습니다. 원시 소켓 API를 멋지게 캡슐화하고 데이터를 보내고받을 수있는 다양한 특정 패턴을 제공하는 훌륭한 zeromq 라이브러리를 확인해 보라고 조언합니다.

설명하는 문제에 대해 zeromq에서 지원하는 "게시/구독"패턴이 매우 적합 할 수 있습니다.

Zeromq는 크로스 플랫폼 C 라이브러리이지만 좋은 CLR/.NET 래퍼를 사용할 수 있습니다. 예를 들어 소개로이 기사를 읽으시기 바랍니다 : http://www.codeproject.com/Articles/488207/ZeroMQ-via-Csharp-Introduction

+1

https://github.com/zeromq/netmq .NET 용 ZeroMQ의 100 % 기본 C# 구현 –