C# Network - Socket, TCP, UDP

Programming/C# · 2020. 9. 16. 15:39

Socket Client

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
 
namespace sockcli
{
    class Program
    {
        static void Main(string[] args)
        {
            // (1) 소켓 객체 생성 (TCP 소켓)
            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 
            // (2) 서버에 연결
            var ep = new IPEndPoint(IPAddress.Parse("192.168.1.13"), 7000);
            sock.Connect(ep);
 
            string cmd = string.Empty;
            byte[] receiverBuff = new byte[8192];
 
            Console.WriteLine("Connected... Enter Q to exit");
 
            // Q 를 누를 때까지 계속 Echo 실행
            while ((cmd = Console.ReadLine()) != "Q")
            {
                byte[] buff = Encoding.UTF8.GetBytes(cmd);
 
                // (3) 서버에 데이타 전송
                sock.Send(buff, SocketFlags.None);
 
                // (4) 서버에서 데이타 수신
                int n = sock.Receive(receiverBuff);
 
                string data = Encoding.UTF8.GetString(receiverBuff, 0, n);
                Console.WriteLine(data);
            }
 
            // (5) 소켓 닫기
            sock.Close();
        }
    }
}

Socket Server

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
 
namespace socksrv
{
    class Program
    {
        static void Main(string[] args)
        {
            // (1) 소켓 객체 생성 (TCP 소켓)
            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 
            // (2) 포트에 바인드
            IPEndPoint ep = new IPEndPoint(IPAddress.Any, 7000);
            sock.Bind(ep);
 
            // (3) 포트 Listening 시작
            sock.Listen(10);
 
            // (4) 연결을 받아들여 새 소켓 생성 (하나의 연결만 받아들임)
            Socket clientSock = sock.Accept();
 
            byte[] buff = new byte[8192];
            while (!Console.KeyAvailable) // 키 누르면 종료
            {
                // (5) 소켓 수신
                int n = clientSock.Receive(buff);
 
                string data = Encoding.UTF8.GetString(buff, 0, n);
                Console.WriteLine(data);
 
                // (6) 소켓 송신
                clientSock.Send(buff, 0, n, SocketFlags.None);  // echo
            }
 
            // (7) 소켓 닫기
            clientSock.Close();
            sock.Close();
        }
    }
}

 

TCP Client

using System;
using System.Net.Sockets;
using System.Text;
 
namespace TcpCli
{
    class Program
    {
        static void Main(string[] args)
        {
            // (1) IP 주소와 포트를 지정하고 TCP 연결 
            TcpClient tc = new TcpClient("127.0.0.1", 7000);
            //TcpClient tc = new TcpClient("localhost", 7000);
 
            string msg = "Hello World";
            byte[] buff = Encoding.ASCII.GetBytes(msg);
 
            // (2) NetworkStream을 얻어옴 
            NetworkStream stream = tc.GetStream();
 
            // (3) 스트림에 바이트 데이타 전송
            stream.Write(buff, 0, buff.Length);
 
            // (4) 스트림으로부터 바이트 데이타 읽기
            byte[] outbuf = new byte[1024];
            int nbytes = stream.Read(outbuf, 0, outbuf.Length);
            string output = Encoding.ASCII.GetString(outbuf, 0, nbytes);
 
            // (5) 스트림과 TcpClient 객체 닫기
            stream.Close();
            tc.Close();
 
            Console.WriteLine($"{nbytes} bytes: {output}");
        }
    }
}


static void Main(string[] args)
{
    // (1) IP 주소와 포트를 지정하고 TCP 연결             
    TcpClient tc = new TcpClient("localhost", 7000);
 
    string msg = "Hello World";
    byte[] buff = Encoding.ASCII.GetBytes(msg);
 
    // (2) NetworkStream을 얻어옴 
    NetworkStream stream = tc.GetStream();
 
    // (3) 스트림에 바이트 데이타 전송
    stream.Write(buff, 0, buff.Length);
 
    // (4) 서버가 Connection을 닫을 때가지 읽는 경우
    byte[] outbuf = new byte[1024];
    int nbytes;
    MemoryStream mem = new MemoryStream();
    while ((nbytes = stream.Read(outbuf, 0, outbuf.Length)) > 0)
    {
        mem.Write(outbuf, 0, nbytes);
    }
    byte[] outbytes = mem.ToArray();
    mem.Close();
 
    // (5) 스트림과 TcpClient 객체 닫기
    stream.Close();
    tc.Close();
 
    Console.WriteLine(Encoding.ASCII.GetString(outbytes));
}

TCP Server

using System.Net.Sockets;
using System.Net;
 
namespace TcpSrv
{
    class Program
    {
        static void Main(string[] args)
        {
            // (1) 로컬 포트 7000 을 Listen
            TcpListener listener = new TcpListener(IPAddress.Any, 7000);
            listener.Start();
 
            byte[] buff = new byte[1024];
 
            while (true)
            {
                // (2) TcpClient Connection 요청을 받아들여
                //     서버에서 새 TcpClient 객체를 생성하여 리턴
                TcpClient tc = listener.AcceptTcpClient();
 
                // (3) TcpClient 객체에서 NetworkStream을 얻어옴 
                NetworkStream stream = tc.GetStream();
 
                // (4) 클라이언트가 연결을 끊을 때까지 데이타 수신
                int nbytes;
                while ((nbytes = stream.Read(buff, 0, buff.Length)) > 0)
                {
                    // (5) 데이타 그대로 송신
                    stream.Write(buff, 0, nbytes);
                }
                 
                // (6) 스트림과 TcpClient 객체 
                stream.Close();
                tc.Close();
 
                // (7) 계속 반복
            }
        }
    }
}

UDP Client

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using static System.Console;
 
namespace UdpCli
{
    class Program
    {
        static void Main(string[] args)
        {
            // (1) UdpClient 객체 성성
            UdpClient cli = new UdpClient();
 
            string msg = "안녕하세요";
            byte[] datagram = Encoding.UTF8.GetBytes(msg);
             
            // (2) 데이타 송신
            cli.Send(datagram, datagram.Length, "127.0.0.1", 7777);
            WriteLine("[Send] 127.0.0.1:7777 로 {0} 바이트 전송", datagram.Length);
 
            // (3) 데이타 수신
            IPEndPoint epRemote = new IPEndPoint(IPAddress.Any, 0);
            byte[] bytes = cli.Receive(ref epRemote);
            WriteLine("[Receive] {0} 로부터 {1} 바이트 수신", epRemote.ToString(), bytes.Length);
 
            // (4) UdpClient 객체 닫기
            cli.Close();
        }
    }
}

UDP Server

using System;
using System.Net;
using System.Net.Sockets;
 
namespace UdpSrv
{
    class Program
    {
        static void Main(string[] args)
        {
            // (1) UdpClient 객체 성성. 포트 7777 에서 Listening
            UdpClient srv = new UdpClient(7777);
 
            // 클라이언트 IP를 담을 변수
            IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0);
 
            while(true)
            {
                // (2) 데이타 수신
                byte[] dgram = srv.Receive(ref remoteEP);
                Console.WriteLine("[Receive] {0} 로부터 {1} 바이트 수신", remoteEP.ToString(), dgram.Length);
 
                // (3) 데이타 송신
                srv.Send(dgram, dgram.Length, remoteEP);
                Console.WriteLine("[Send] {0} 로 {1} 바이트 송신", remoteEP.ToString(), dgram.Length);
            }
        }
    }
}
반응형

'Programming > C#' 카테고리의 다른 글

[C#] #1 - Serial Communication 기초  (0) 2020.07.02