SocketSampleUDP.cs
2.93 KB
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
using UnityEngine;
using System.Net;
using System.Net.Sockets;
// UDP는 TCP와 달리 서버와 클라이언트의 구별도 없고
// 서버가 대기할 필요도 없고
// 받는 주소와 포트를 지정해 보내기만 하면됨
public class SocketSampleUDP : MonoBehaviour
{
// 접속 주소 IPv4
private string m_address = "127.0.0.1";
private int m_port = 54329;
private Socket m_socket = null;
private enum State
{
Idle, // 통신을 시작 안함
CreateListener, // 데이터를 받기 위한 소켓 생성
Receving, // 소켓에서 메세지를 꺼내는 중
CloseListener, // 데이터를 받는 소켓을 닫기
Sending, // 소켓으로 메세지를 보내는 중
End // 네트워크 마감
}
private State m_state = State.Idle;
// 데이터를 받는 소켓 생성
private void CreateListener()
{
Debug.Log("UDP - 소켓 연결 시작");
m_socket =
new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
ProtocolType.Udp);
m_socket.Bind(new IPEndPoint(IPAddress.Any, m_port));
m_state = State.Receving;
}
private void Receving()
{
byte[] buffer = new byte[1400];
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint remoteSender = (EndPoint)sender;
if (m_socket.Poll(0, SelectMode.SelectRead))
{
int recvSize
= m_socket.
ReceiveFrom(buffer, SocketFlags.None, ref remoteSender);
if (recvSize > 0)
{
string message
= System.Text.Encoding.UTF8.GetString(buffer);
Debug.Log(message);
m_state = State.CloseListener;
}
}
}
// 대기 종료
private void CloseListener()
{
if (m_socket != null)
{
m_socket.Close();
m_socket = null;
}
m_state = State.End;
Debug.Log("UDP - 통신 끝");
}
private void Sending()
{
Debug.Log("UDP - 통신 시작");
m_socket =
new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
ProtocolType.Udp);
byte[] buffer =
System.Text.Encoding.UTF8.GetBytes("This is Client! from UDP");
IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(m_address),
m_port);
m_socket.SendTo(buffer, buffer.Length, SocketFlags.None, endPoint);
m_socket.Shutdown(SocketShutdown.Both);
m_socket.Close();
m_state = State.End;
Debug.Log("UDP - 통신 끝");
}
public void OnServerButtonClicked()
{
m_state = State.CreateListener;
}
public void OnClientButtonClicked()
{
m_state = State.Sending;
}
public void ChangeIPAddress(string ipAddress)
{
m_address = ipAddress;
}
private void Update()
{
switch (m_state)
{
case State.Sending:
Sending();
break;
case State.CreateListener:
CreateListener();
break;
case State.Receving:
Receving();
break;
case State.CloseListener:
CloseListener();
break;
case State.End:
break;
case State.Idle:
break;
default:
break;
}
}
}