2010-02-23 2 views
1

우리가 알고 있듯이 .Net에는 UDP 용 간단한 소켓 사용을위한 UdpClient가 있습니다. MSDN에서원시 소켓과 UdpClient 간의 성능 (또는 기타) 차이점은 무엇입니까?

:

당신이 비교적 간단한 응용 프로그램을 작성하고, 최대 성능을 필요로하여 TcpClient, TcpListener 및 UdpClient를 사용하는 것을 고려하지 않는 경우. 이 클래스는 소켓 통신에 대해보다 간단하고 사용자 친화적 인 인터페이스를 제공합니다.

원시 소켓과 UdpClient의 성능 차이는 얼마나됩니까? UdpClient는 Udp 용 소켓 래퍼이며 비동기 읽기/쓰기를 가지고 있지 않습니다.

다른 건 없나요?

감사

답변

4

문서에서 알 수 있듯이 UdpClient/TcpClient는 Socket 클래스 위에 얇은 래퍼입니다. 원하는 모든 것이 데이터 묶음을 보내거나받는다면,이 클래스들은 훌륭합니다. 이 시나리오에서는 Socket과 UdpClient/TcpClient간에 성능 차이가 없습니다.

그러나 Socket은 XXXAsync() 메소드의 형태로 IO를 수행하는 더 빠른 방법을 제공합니다. 이 방법을 사용하면 매우 빠른 I/O를 수행 할 수 있으며 TcpClient/UdpClient에서 노출되지 않습니다. 그것이 문서가 "퍼프 차이 (perf difference)"를 의미하는 것입니다. 즉, 퍼포먼스가 더 빠르면 Socket 클래스를 파고 이러한 메서드 (XXXAsync)를 사용해야합니다.

0

UDP는, 트레이드 오프 TCP와,이 TCP보다 빠른 점이다 제로 오류 검사가있는 연결 프로토콜입니다. UDP는 TCP와 비교할 때 불과 잊어 버린 프로토콜로 생각하십시오. 여기서 무결성과 체크섬은 UDP를 통한 TCP의 추가 오버 헤드입니다.

RawSocket에는 사용중인 프로토콜에 관계없이 영향이 없습니다. RawSocket은 원시입니다. 원본/대상 IP 주소와 같은 관련 헤더에 입력하고 헤더가 관련 프로토콜을 준수하는지 확인해야합니다. 소켓의 속도와는 아무런 관련이 없습니다. 물론 프로토콜의 선택에 달려 있습니다.

호프가 도움이 되었으면 안녕하세요, 탐.

+0

@ tommieb75 : 원시 소켓 의미는 입니다. 소켓 tempSocket = 새 소켓 (ipe.AddressFamily, SocketType.Stream, ProtocolType.UDP); 위의 문을 사용하여 Udpclient 대신 UDP를 사용하면 성능 차이는 무엇입니까 ??? .Net이 있다고합니다 – Jack

+0

UDP와 함께 Stream을 사용할 수 없습니다. SocketException을 제공합니다. – Shashwat

4

sendfile이 빠르지 않습니다.


using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Net; 
using System.Net.Sockets; 
using System.Net.Cache; 
using System.Threading; 

namespace socket_sendfile 
{ 
    delegate TimeSpan SendFileDelegate(Socket client, String filename, long fileSize); 

    class Header 
    { 
     public long FileSize { get; set; } 
     public int FileNumber { get; set; } 

     public void Serialize(Stream stream) 
     { 
      byte[] buffer = BitConverter.GetBytes(this.FileNumber); 
      stream.Write(buffer, 0, buffer.Length); 

      buffer = BitConverter.GetBytes(this.FileSize); 
      stream.Write(buffer, 0, buffer.Length); 
     } 

     public static Header Deserialize(Stream stream) 
     { 
      Header header = new Header(); 

      byte[] buffer = new byte[4]; 
      int read = stream.Read(buffer, 0, buffer.Length); 
      header.FileNumber = BitConverter.ToInt32(buffer, 0); 

      buffer = new byte[sizeof(long)]; 
      read = stream.Read(buffer, 0, buffer.Length); 
      header.FileSize = BitConverter.ToInt64(buffer, 0); 
      return header; 
     } 
    } 

    class Program 
    { 
     private Random rand = new Random(); 

     static void Main(string[] args) 
     { 
      Program prog = new Program(); 

      try 
      { 
       prog.StartServer(); 

       using (Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) 
       { 
        client.Bind(new IPEndPoint(0, 0)); 
        client.Connect(new IPEndPoint(IPAddress.Loopback, 8080)); 

        prog.Run(client, new SendFileDelegate(prog.SendFile1)); 

        Console.WriteLine(); 
        prog.Run(client, new SendFileDelegate(prog.SendFile2)); 
       } 
      } 
      catch (Exception e) 
      { 
       Console.Error.WriteLine(e); 
      } 
      Console.ReadKey(); 
     } 

     void StartServer() 
     { 
      Thread serverThread = new Thread(new ThreadStart(this.Server)); 
      serverThread.Start(); 
     } 

     void Run(Socket client, SendFileDelegate sendFileMethod) 
     { 
      foreach (long size in this.GetNextSize()) 
      { 
       String filename = Path.GetTempFileName(); 

       this.CreateFile(filename, size); 

       for (int i = 0; i GetNextSize() 
     { 
      ulong[] sizes = { 1024, 4096, 8192, 16385, 65536, 1048576 }; 
      for (int i = 0; i 0) 
       { 
        rand.NextBytes(buffer); 
        int writeSize = buffer.Length; 
        if (writeSize > (int)remaining) 
        { 
         writeSize = (int)remaining; 
        } 

        bw.Write(buffer, 0, writeSize); 
        remaining -= writeSize; 
       } 
      } 
     } 

     TimeSpan SendFile1(Socket client, String filename, long fileSize) 
     { 
      Stopwatch timer = new Stopwatch(); 

      //timer.Start(); 
      using (NetworkStream ns = new NetworkStream(client)) 
      { 
       Header header = new Header(); 
       header.FileSize = fileSize; 
       header.FileNumber = 1; 

       // send the header 
       header.Serialize(ns); 

       using (FileStream fs = File.OpenRead(filename)) 
       { 
        //byte[] buffer = new byte[1024]; 
        byte[] buffer = new byte[fileSize]; 
        int read = fs.Read(buffer, 0, buffer.Length); 
        //Console.WriteLine("read = " + read); 

        while (read > 0) 
        { 
         timer.Start(); 
         ns.Write(buffer, 0, read); 
         timer.Stop(); 
         read = fs.Read(buffer, 0, buffer.Length); 
         //Console.WriteLine("read = " + read); 
        } 
       } 
      } 

      //timer.Stop(); 

      return timer.Elapsed; 
     } 

     TimeSpan SendFile2(Socket client, String filename, long fileSize) 
     { 
      Stopwatch timer = new Stopwatch(); 

      //timer.Start(); 
      using (NetworkStream ns = new NetworkStream(client)) 
      { 
       Header header = new Header(); 
       header.FileSize = fileSize; 
       header.FileNumber = 1; 

       byte[] headerBuffer = null; 
       using (MemoryStream ms = new MemoryStream()) 
       { 
        header.Serialize(ms); 
        ms.Seek(0, SeekOrigin.Begin); 
        headerBuffer = ms.ToArray(); 
       } 

       // send the header 
       timer.Start(); 
       client.SendFile(filename, headerBuffer, null, TransmitFileOptions.UseDefaultWorkerThread); 
       timer.Stop(); 
      } 

      //timer.Stop(); 

      return timer.Elapsed; 
     } 

     void Server() 
     { 
      byte[] buffer = new byte[1024]; 
      try 
      { 
       TcpListener listener = new TcpListener(IPAddress.Loopback, 8080); 
       listener.Start(); 
       using (TcpClient client = listener.AcceptTcpClient()) 
       using (NetworkStream ns = client.GetStream()) 
       { 
        bool hasData = true; 
        while (hasData) 
        { 
         // first get the header. Header has the file size. 
         Header header = Header.Deserialize(ns); 

         long remaining = header.FileSize; 

         while (remaining > 0) 
         { 
          int readSize = buffer.Length; 
          if ((long)readSize > remaining) 
           readSize = (int)remaining; 

          int read = ns.Read(buffer, 0, readSize); 
          remaining -= read; 
         } 
        } 
       } 
      } 
      catch (System.Exception ex) 
      { 
       Console.WriteLine(ex.ToString()); 
      } 

     } 
    } 
} 

내 소중한 시간을 낭비했습니다.