C #에서 소켓을 사용하는 방법

프로세스 간 통신은 둘 이상의 연결된 프로세스간에 데이터를 교환하는 기능이며 소켓을 사용하여 수행 할 수 있습니다. 서버와 클라이언트 사이의 연결, 즉 서버 프로세스와 클라이언트 프로세스가 설정되면 소켓을 사용하여 데이터를 교환 할 목적으로 통신 할 수 있습니다.

소켓은 네트워크를 통해 실행되는 두 프로세스 간의 양방향 통신의 끝점입니다. System.Net 및 System.Net.Sockets 네임 스페이스를 활용하여 C #의 소켓을 사용할 수 있습니다. 전자는 소켓을 사용하는 높은 수준의 작업에 사용되는 반면 후자는 소켓으로 작업 할 때 낮은 수준의 작업에 사용됩니다.

소켓으로 작업 할 때 TCP / IP (전송 제어 프로토콜 / 인터넷 프로토콜) 또는 UDP / IP (사용자 데이터 그램 프로토콜 / 인터넷 프로토콜) 통신 메커니즘을 사용할 수 있습니다. 네트워크를 통해 둘 이상의 프로세스간에 데이터를 교환하기 위해 TCP 및 UDP 전송 프로토콜을 이용할 수 있습니다. TCP (전송 제어 프로토콜)는 안전하고 신뢰할 수있는 연결 지향 프로토콜이지만 UDP (사용자 데이터 그램 프로토콜)는 상대적으로 덜 안전하거나 신뢰할 수 있으며 빠르고 연결이없는 프로토콜입니다.

다음 코드 목록은 System.Net.Dns 클래스를 활용하여 시스템의 IP 주소를 표시하는 방법을 보여줍니다.

public static void Main(string[] args)

        {

            string hostName = Dns.GetHostName();

            try

            {

                IPAddress[] ipAddress = Dns.Resolve(hostName).AddressList;

                foreach (IPAddress address in ipAddress)

                    Console.WriteLine("{0}/{1}", hostName, address);

            }

            catch (Exception ex)

            {

                Console.WriteLine("Error occurred: "+ex.Message);

            }

            Console.Read();

        }

위의 코드 목록을 참조하십시오. Dns.GetHostName () 메서드는 시스템 이름을 반환하지만 Dns.Resolve () 메서드는 IPHostEntry 유형의 배열을 검색하는 데 사용됩니다.

네트워크 정보 검색

System.Net.NetworkInformation 네임 스페이스는 C #에서 네트워크 메타 데이터 (예 : 네트워크 변경, 네트워크 이벤트, 속성 등)를 검색하는 데 사용할 수 있습니다. 예를 들어 네트워크 연결이 가능한지 확인하려면 아래와 같이 GetIsNetworkAvailable () 메서드를 사용할 수 있습니다.

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable ();

코드에서이 메서드를 호출하는 방법은 다음과 같습니다.

Boolean networkAvailable = NetworkInterface.GetIsNetworkAvailable();

IP 주소의 변경 사항을 모니터링하려면 NetworkChange 클래스의 다음 이벤트를 사용할 수 있습니다.

System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged

System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged

네트워크 인터페이스에 대한 정보를 검색하려면 NetworkInterface 클래스의 GetAllNetworkInterfaces () 메서드를 사용할 수 있습니다.

NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();

모든 네트워크 인터페이스 목록을 검색 한 후 다음 코드를 사용하여 각 네트워크 인터페이스 정보를 콘솔에 표시 할 수 있습니다.

foreach (NetworkInterface networkInterface in networkInterfaces)

            {

                Console.WriteLine("Network ID :  " + networkInterface.Id);

                Console.WriteLine("Network Name :  " + networkInterface.Name);

                Console.WriteLine("Network Description\n:  " + networkInterface.Description);               

            }

참조 할 수있는 전체 코드 목록은 다음과 같습니다.

static void Main(string[] args)

        {

            NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();

            foreach (NetworkInterface networkInterface in networkInterfaces)

            {

                Console.WriteLine("Network ID  :  " + networkInterface.Id);

                Console.WriteLine("Network Name  :  " + networkInterface.Name);

                Console.WriteLine("Network Description  \n:  " + networkInterface.Description);               

            }

            Console.Read();

        }

클라이언트-서버 프로그래밍

TCP를 사용하는 네트워크 프로그래밍으로 작업 할 때 일반적으로 특정 포트에서 시작해야하는 서버 프로세스와 모든 포트에서 시작하여 서버에 연결 요청을 보낼 수있는 클라이언트 프로세스를 만들어야합니다. 시작된 후 서버 프로세스는 시작된 포트에서 들어오는 연결 요청을 수신합니다. 다음 코드 조각은 System.Net.Sockets.TcpListener 클래스를 활용하고 소켓 클래스와 함께 사용하는 방법을 보여줍니다.

TcpListener listener = new TcpListener(1234);

listener.Start();

Socket socket = listener.AcceptSocket();

Stream networkStream = new NetworkStream(socket);

다음 코드 스 니펫은 소켓 클라이언트가 TCP 프로토콜을 사용하여 서버에 연결하는 방법을 보여줍니다.

String ipAddress = "specify the ip address here";

System.Net.IPAddress ipAddress = System.Net.IPAddress.Parse(ipAddress);

System.Net.IPEndPoint remoteEndPoint = new IPEndPoint (ipAddress,9000);

socketClient.Connect (remoteEndPoint);

클라이언트에서 서버로 데이터를 보내려면 다음 코드 스 니펫을 사용할 수 있습니다.

try

{

  String text = "Hello World!";

  byte[] data = System.Text.Encoding.ASCII.GetBytes(text);

  socketClient.Send(data);

}

catch (SocketException se)

{

  //Write your exception handling code here

}

소켓 클래스의 Receive () 메서드를 사용하여 데이터를받을 수 있습니다. 다음은이를 사용하여 소켓에서 데이터를 검색하는 방법입니다. Send 및 Receive 메서드는 모두 차단됩니다. 즉, 데이터를 보내거나받을 때까지 현재 실행중인 스레드를 차단합니다.

byte[] data = new byte[1024];

int i = socketClient.Receive (data);

소켓을 사용하려면 프로그램에 System.Net 및 System.Net.Sockets 네임 스페이스를 통합해야합니다.

using System.Net;

using System.Net.Sockets;