반응형

콘솔에서 간단한 메세지를 주고 받는 서버, 클라이언트를 만들어 보자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
using System.Net;
using System.Net.Sockets;
 
namespace Server
{
    class Program
    {
        static void Main(string[] args)
        {
            IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("192.168.0.100"), 7777);
            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 
            Console.WriteLine("■ Server Info:");
            Console.WriteLine("IP Address : {0}", serverEndPoint.Address);
            Console.WriteLine("Port Number: {0}", serverEndPoint.Port);
            Console.WriteLine("AddressFamily : {0}", serverEndPoint.AddressFamily);
 
            // Associates a Socket with a local endpoint.
            server.Bind(serverEndPoint);
 
            // Places a Socket in a listening state.
            // Parameter: The maximum length of the pending connections queue.
            server.Listen(5);
 
            Console.WriteLine("Waiting for a client...");
 
            // Creates a new Socket for a newly created connection.
            Socket client = server.Accept();
 
            IPEndPoint clientEndPoint = (IPEndPoint)client.RemoteEndPoint;
            Console.WriteLine("Client connected: {0}", clientEndPoint.Address);
 
            byte[] sendBuff = Encoding.UTF8.GetBytes("Connected to the server.");
            // Sends the specified number of bytes of data to a connected Socket, using the specified SocketFlags.
            client.Send(sendBuff, sendBuff.Length, SocketFlags.None);
 
            byte[] recvBuff = new byte[256];
            // Receives data from a bound Socket into a receive buffer.
            // Return: The number of bytes received.
            if (client.Receive(recvBuff) != 0)
            {
                Console.WriteLine("Message from a client: " + Encoding.UTF8.GetString(recvBuff));
            } else
            {
                Console.WriteLine("No message.");
            }
 
            // Closes the Socket connection and releases all associated resources.
            client.Close();
            server.Close();
        }
    }
}
 

 

서버 소스

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
using System.Net;
using System.Net.Sockets;
 
namespace Client
{
    class Program
    {
        static void Main(string[] args)
        {
            IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("192.168.0.100"), 7777);
            Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 
            // Establishes a connection to a remote host.
            client.Connect(serverEndPoint);
            Console.WriteLine("Connecting to the server...");
 
            byte[] recvBuff = new byte[256];
            client.Receive(recvBuff);
            Console.WriteLine("Message from the server: " + Encoding.UTF8.GetString(recvBuff));
 
            client.Send(Encoding.UTF8.GetBytes("Hello."));
 
            client.Close();
        }
    }
}
 

 

클라이언트 소스

 

서버를 실행 시키면 클라이언트를 기다린다.

 

클라이언트를 실행 시키면 대기중인 서버와 연결되고 메세지를 주고 받는다.

 

서버에도 클라이언트로부터 받은 메세지가 표시된다.

 

반응형
Posted by J-sean
:
반응형

IP 주소와 호스트 네임을 확인 해 보자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
using System.Net;
 
namespace CS
{
    using static System.Console;
 
    class Program
    {
        static void Main(string[] args)
        {
            // 인터넷 url로 IP 주소 확인
            string url = "www.naver.com";
            IPHostEntry ipHostEntry = Dns.GetHostEntry(url);
            WriteLine("■ IP addresses of " + url);
            foreach (IPAddress add in ipHostEntry.AddressList)
            {
                WriteLine(add.ToString());
            }
 
            // 호스트 네임으로 IP 주소 확인
            WriteLine();
            string hostName = Dns.GetHostName();
            ipHostEntry = Dns.GetHostEntry(hostName);
            WriteLine("■ All IP addresses of " + ipHostEntry.HostName);
            // WriteLine(hostName);            
            foreach (IPAddress address in ipHostEntry.AddressList)
            {
                WriteLine(address.ToString());
            }
 
            WriteLine();
            WriteLine("■ All IP6 addresses of " + ipHostEntry.HostName);
            foreach (IPAddress address in ipHostEntry.AddressList)
            {
                if (address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6)
                    WriteLine(address.ToString());
            }
 
            WriteLine();
            WriteLine("■ All IP4 addresses of " + ipHostEntry.HostName);
            foreach (IPAddress address in ipHostEntry.AddressList)
            {
                if (address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                    WriteLine(address.ToString());
            }
 
            WriteLine();
            WriteLine("■ All IP4 addresses of " + ipHostEntry.HostName);
            foreach (IPAddress address in ipHostEntry.AddressList)
            {
                if (address.ToString().Split('.').Count() == 4)
                    WriteLine(address.ToString());
            }
 
            // IP 주소로 호스트 네임 확인
            WriteLine();
            IPAddress ipAddress = IPAddress.Parse(ipHostEntry.AddressList[0].ToString());
            // IPAddress ipAddress = IPAddress.Parse("192.168.0.100"); // My internal IP address
            ipHostEntry = Dns.GetHostEntry(ipAddress);
            Console.WriteLine("■ Host name: " + ipHostEntry.HostName);
 
            // 웹사이트를 이용한 외부 IP 주소 확인
            WriteLine();
            try
            {
                string externalIP = new WebClient().DownloadString("http://ipinfo.io/ip").Trim();
                // or http://icanhazip.com
                WriteLine("■ External IP address: " + externalIP);
            }
            catch (Exception exc)
            {
                WriteLine(exc.Message);
            }
        }
    }
}
 

 

소스를 입력하고 빌드한다.

 

IP 주소 및 호스트 네임을 확인 할 수 있다.

 

반응형
Posted by J-sean
:

C# Default Value - 기본값

C# 2021. 12. 19. 13:00 |
반응형

default 키워드로 각 타입의 기본값을 확인 할 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace CS
{
    using static System.Console;
 
    class Program
    {
        static void Main(string[] args)
        {
            int a = default;
            int b = default(int);
            WriteLine($"a: {a}");
            WriteLine($"b: {b}");
            WriteLine($"default(float): {default(float)}");
            WriteLine($"default(bool): {default(bool)}");
 
            WriteLine($"default(string): {default(string) ?? "null"}");
            string s = null;
            WriteLine($"string.IsNullOrEmpty(s): {string.IsNullOrEmpty(s)}");
 
            WriteLine("default(char): {0}"default(char== '\0' ? @"\0" : @"not \0");
            // char는 기본값으로 '\0'이 대입 되기 때문에 아래 명령은 아무것도 표시하지 않는다.
            // WriteLine($"default(char): {default(char)}");
            WriteLine("default(int[]): {0}"default(int[]) == null ? "null" : "not null");
        }
    }
}
 

 

 

 

반응형
Posted by J-sean
:

C# typeof - 타입 정보 확인

C# 2021. 12. 15. 14:36 |
반응형

타입의 정보를 알 수 있는 typeof 연산자는 System.Type 객체를 리턴한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
using System.Reflection;
 
namespace CS
{
    using static System.Console;
 
    class Program
    {
        static void Main(string[] args)
        {
            Test testInstance = new Test();
            Type t = typeof(Test);
            MemberInfo[] members = t.GetMembers(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
 
            WriteLine($"Class Full Name: {t.FullName}\n");
            foreach (MemberInfo member in members)
            {
                WriteLine($"Member: {member.ToString()}"); // == WriteLine($"({member})");
                WriteLine($"Name: {member.Name},\tType: {member.MemberType},\tClass: {member.DeclaringType}\n");
            }
 
            WriteLine($"testInstance.GetType(): {testInstance.GetType()}");
            WriteLine($"typeof(Test): {typeof(Test)}");
            WriteLine($"testInstance.GetType() == typeof(Test): {testInstance.GetType() == typeof(Test)}");
        }
    }
 
    class Test
    {
        int _a;
        int _b;
 
        public Test()
        {
            _a = 1;
            _b = 2;
        }
 
        public Test(int a, int b)
        {
            _a = a;
            _b = b;
        }
 
        private void Info()
        {
            WriteLine("Test Info.");
        }
    }
}
 

 

소스를 입력하고 빌드한다.

 

타입의 정보가 표시된다.

 

반응형
Posted by J-sean
:
반응형

Property Grid를 사용해 보자.

 

폼에 프로퍼티 그리드를 적당히 배치한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        private Transcript ts = new Transcript();
 
        public Form1()
        {
            InitializeComponent();
 
            propertyGrid1.SelectedObject = ts;
        }
 
        private void propertyGrid1_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
        {
            switch (e.ChangedItem.Label)
            {
                case "Score_Math":
                    MessageBox.Show("수학 점수: " + e.ChangedItem.Value.ToString());
                    break;
 
                case "Score_Korean":
                    MessageBox.Show("국어 점수: " + e.ChangedItem.Value.ToString());
                    break;
 
                case "Score_English":
                    MessageBox.Show("영어 점수: " + e.ChangedItem.Value.ToString());
                    break;
 
                case "Rank_Math":
                    MessageBox.Show("수학 등수: " + e.ChangedItem.Value.ToString());
                    break;
 
                case "Rank_Korean":
                    MessageBox.Show("국어 등수: " + e.ChangedItem.Value.ToString());
                    break;
 
                case "Rank_English":
                    MessageBox.Show("영어 등수: " + e.ChangedItem.Value.ToString());
                    break;
 
                default:
                    MessageBox.Show("N/A");
                    break;
            }
        }
    }
 
    class Transcript
    {
        [Category("Score"), Description("수학 점수"), DisplayName("Score_Math")]
        public int Score_Math
        {
            get;
            set;
        }
 
        [Category("Score"), Description("국어 점수"), DisplayName("Score_Korean")]
        public int Score_Korean
        {
            get;
            set;
        }
 
        [Category("Score"), Description("영어 점수"), DisplayName("Score_English")]
        public int Score_English
        {
            get;
            set;
        }
 
        [Category("Rank"), Description("수학 등수"), DisplayName("Rank_Math")]
        public int Rank_Math
        {
            get;
            set;
        }
 
        [Category("Rank"), Description("국어 등수"), DisplayName("Rank_Korean")]
        public int Rank_Korean
        {
            get;
            set;
        }
 
        [Category("Rank"), Description("영어 등수"), DisplayName("Rank_English")]
        public int Rank_English
        {
            get;
            set;
        }
 
        public Transcript()
        {
            Score_Math = 96;
            Score_Korean = 94;
            Score_English = 98;
            Rank_Math = 2;
            Rank_Korean = 5;
            Rank_English = 3;
        }
    }
}
 

 

프로퍼티 그리드에 지정할 오브젝트로 만들 클래스를 정의하고 프로퍼티 값 변경 이벤트등 위와 같은 소스를 작성한다.

 

빌드하고 실행하면 위와 같은 화면이 나타난다.

 

각 항목의 값을 변경하면 지정된 이벤트가 발생한다.

 

프로퍼티 그리드 오브젝트 클래스 선언시 Default Property를 지정할 수 도 있다.

 

Default Property로 지정한 항목이 선택된 채 실행 된다.

 

반응형
Posted by J-sean
:
반응형

기존 타입에 메소드를 추가할 수 있는 확장 메소드를 사용해 보자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace CS
{
    using static System.Console;
 
    class Program
    {
        static void Main(string[] args)
        {
            Random R = new Random();
            WriteLine($"myNumber: {R.myNumber(7)}.");
        }
    }
 
    static class RandomExtension
    {
        public static int myNumber(this Random r, int n)
        {
            int temp = r.Next(010);
            WriteLine($"temp: {temp}");
            return temp + n;
        }
    }
}
 

 

소스를 입력하고 빌드한다.

 

실행화면

 

Extension Methods

 

반응형
Posted by J-sean
:
반응형

입력 문자열 형식 에러 잡는 방법 두 가지를 알아보자.

Try-Catch 구문을 사용하거나 TryParse()를 사용할 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace CS
{
    using static System.Console;
 
    class Program
    {
        static void Main(string[] args)
        {
            int age;
            string ageText;
 
            Write("Enter your age: ");
            ageText = ReadLine();
 
            // Try-Catch
            try
            {
                age = int.Parse(ageText);
                WriteLine($"You are {age * 12} months old.");
            }
            catch (FormatException exc)
            {
                WriteLine($"The age entered, {ageText}, is not valid: {exc.Message}");
            }
            catch (Exception exc)
            {
                WriteLine($"Unexpected error: {exc.Message}");
            }
            finally
            {
                WriteLine("Goodbye.");
            }
 
            // TryParse()
            if (int.TryParse(ageText, out age))
            {
                WriteLine($"You are {age * 12} months old.");
            } else
            {
                WriteLine($"The age entered, {ageText}, is not valid.");
            }
        }
    }
}
 

 

소스를 입력하고 빌드한다.

 

실행하고 숫자를 입력하면 아무 문제없이 출력된다.

 

숫자가 아닌 문자가 입력되면 에러가 발생하고 잘 처리된다.

 

반응형
Posted by J-sean
:
반응형

유저 컨트롤(dll)을 만들고 사용해 보자.

 

Windows Forms Control Library 프로젝트를 만든다.

 

폼에 버튼과 레이블을 적당히 배치한다.

 

간단한 코드를 작성한다.

 

빌드하고 실행하면 컨트롤을 테스트하고 속성을 확인 할 수 있는 화면이 나타난다.

 

 

Output 폴더에 dll 파일이 생성 되었다.

 

이번엔 Windows Forms App 프로젝트를 만든다.

 

툴 박스에서 마우스 우클릭 - Choose Items... 를 선택한다.

 

Browse... 를 클릭한다.

 

 

위에서 만든 컨트롤 dll 파일을 선택한다.

 

유저 컨트롤이 추가 되었다. OK를 클릭한다.

 

툴 박스에 자동으로 등록된다.

 

마우스 우클릭 - Rename Item 으로 이름을 바꿀 수 있다.

 

 

폼에 적당히 배치한다.

 

추가 코드 작성 없이 빌드하고 실행하면 잘 작동한다.

실행 파일(exe)과 컨트롤 라이브러리 파일(dll)을 함께 배포해야 한다.

 

반응형
Posted by J-sean
: