프로그램 설명
한 프로그램에서 여러개의 포트를 열어서 작업이 필요한 경우입니다.
포트별로 쓰레드를 만들어서 작업하는 방식입니다. 예제에서는 8080, 8081 포트를 엽니다.
![](https://t1.daumcdn.net/cfile/tistory/234B043D550144E427)
실행 후
![](https://t1.daumcdn.net/cfile/tistory/2127B0425501432903)
프로그램 작성 순서
1. ListenPorts.cs
class ListenPorts
{
Socket[] socket;
IPEndPoint[] ipEndPoint;
internal ListenPorts(IPEndPoint[] ipEndPoint)
{
this.ipEndPoint = ipEndPoint;
socket = new Socket[ipEndPoint.Length];
}
public void beginListen()
{
for(int i = 0; i < ipEndPoint.Length; i++)
{
socket[i] = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket[i].Bind(ipEndPoint[i]);
Thread t_handler = new Thread(threadListen);
t_handler.IsBackground = true;
t_handler.Start(socket[i]);
}
}
private void threadListen(object sender)
{
Socket m_client = sender as Socket;
byte[] data = new byte[1024];
try
{
m_client.Listen(100);
Socket newSocket = m_client.Accept();
int bytes = newSocket.Receive(data);
IPEndPoint remoteIP = newSocket.RemoteEndPoint as IPEndPoint;
IPEndPoint localIP = newSocket.LocalEndPoint as IPEndPoint;
Console.WriteLine("server ip : {0} remote ip : {1} ", localIP.ToString(), remoteIP.ToString());
Console.WriteLine("Received data : {0}", Encoding.Unicode.GetString(data, 0, bytes));
string msg = "Welcome to multiple server";
byte[] buffer = Encoding.Unicode.GetBytes(msg);
newSocket.Send(buffer, buffer.Length, SocketFlags.None);
Console.WriteLine("Send data : {0}", msg);
Console.WriteLine();
}
catch(SocketException se)
{
Console.WriteLine(se.Message);
}
}
}
2. 서버 프로그램
class Program
{
static void Main(string[] args)
{
IPEndPoint ipEndPoint1 = new IPEndPoint(IPAddress.Any, 8080);
IPEndPoint ipEndPoint2 = new IPEndPoint(IPAddress.Any, 8081);
IPEndPoint[] ipEndPoint = new IPEndPoint[2] { ipEndPoint1, ipEndPoint2 };
//IPEndPoint[] ipEndPoint = new IPEndPoint[1] { ipEndPoint1 };
ListenPorts listenport = new ListenPorts(ipEndPoint);
listenport.beginListen();
Console.WriteLine("Begin Listen");
Console.WriteLine();
Console.ReadKey();
}
}
3. 클라이언트 프로그램
class Program
{
static void Main(string[] args)
{
byte[] data = new byte[1024];
//TCP Client
Console.WriteLine("This is a Client, host name is {0}", Dns.GetHostName());
Console.WriteLine();
//Set the IP address of the server, and its port.
IPEndPoint ipep1 = new IPEndPoint(IPAddress.Parse("192.168.0.12"), 8080);
IPEndPoint ipep2 = new IPEndPoint(IPAddress.Parse("192.168.0.12"), 8081);
string welcome = "Hello, Multiple server ! ";
// port 8080 으로 전송
try
{
// 소켓 생성
Socket server1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 메시지 전송
data = Encoding.Unicode.GetBytes(welcome);
server1.Connect(ipep1);
server1.Send(data);
Console.WriteLine("Send by the port : {0}", server1.LocalEndPoint.ToString());
Console.WriteLine("Send data : {0}", welcome);
// 메시지 받음
byte[] msg = new byte[1024];
int bytes = server1.Receive(msg);
Console.WriteLine("Received data : {0}", Encoding.Unicode.GetString(msg, 0, bytes));
Console.WriteLine();
// 소켓 닫기
server1.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
// port 8081 으로 전송
try
{
// 소켓 생성
Socket server2 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 메시지 전송
data = Encoding.Unicode.GetBytes(welcome);
server2.Connect(ipep2);
server2.Send(data);
Console.WriteLine("Send by the port : {0}", server2.LocalEndPoint.ToString());
Console.WriteLine("Send data : {0}", welcome);
// 메시지 받음
byte[] msg = new byte[1024];
int bytes = server2.Receive(msg);
Console.WriteLine("Received data : {0}", Encoding.Unicode.GetString(msg, 0, bytes));
Console.WriteLine();
// 소켓 닫기
server2.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadKey();
}
}