IT Dictionary

소켓 네트워크(Socket Network) (c#)

Jaebins 2023. 5. 26. 16:00
반응형

✌️ 소켓이란?

클라이언트와 서버간 네트워크 통신을 위해 데이터를 송수신할 때 끝점 역할을 해주는 소프트웨어 구조

 

쉽게 이해할려면 그냥 "데이터 송수신 통로" 이걸로 기억하면 될거 같다. 양방향 통신을 지향하며, 일반적으로 스트리밍, 게임 등과 같이 유동적인 데이터 전송이 필요한 서비스에서 사용된다.

 

당연히 이러한 소켓을 구축하기 위해서는 우리가 직접 코드를 짜야되는데, 이것을 소켓 프로그래밍(Socket Programming) 이라고 하며, 소켓 프로그래밍에 대해서는 밑에서 더 다뤄볼려고 한다.

 

✌️ 소켓 통신 과정

기본적으로 통신을 할려면 당연히 서버와 클라이언트가 준비되있어야 한다. 일단 먼저, 서버쪽에 통신 과정을 먼저 알아볼 것이다.

 

✌️ Server

1. socket()

소켓을 생성해주며, 생성된 소켓으로 통신을 시작하게 된다.

2. bind()

서버는 정의되있는 IP 주소와 포트번호를 소켓에 바인딩을 시켜준다.

바인딩 - 프로그램에 사용된 구성 요소의 실제 값 또는 프로퍼티를 결정짓는 행위

3. listen()

서버쪽 소켓은 클라이언트 소켓에서 연결 요청을 하기 전까지 소켓을 대기시키게 된다.
여기서 클라이언트가 서버의 시스템과 포트와 연결을 시도하게 되면, 클라이언트는 연결 중에 사용될 로컬 포트 번호에 바인딩을 하고, 서버에 자신을 식별하게 해준다.

4. accept()

만약 이 과정에서 서버가 클라이언트에 존재를 인식할 수 있다면, 서버는 연결을 수락하게 된다. 

이렇게 클라이언트 한개가 서버와 연결이 되었다면, 서버는 새로운 통신연결 위한 소켓을 하나 더 생성하여 다른 클라이언트와의 통신을 위한 준비를 하게 된다.

 

5. close()

서버와 클라이언트 간 연결되있는 소켓을 끊어준다.

 

✌️ Client

1. socket()

서버와 마찬가지로 새로운 소켓을 생성해주며, 해당 소켓은 서버와 연결하게 될 소켓이다.

2. connet()

서버쪽 네트워크 정보들을 담아 클라이언트 소켓을 서버 소켓에 연결시켜준다.

 

✌️ c# 소켓 프로그래밍 예제

Server

 namespace Server(){
    class Program()
    {
    	static void Main(string[] args){
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint ipt = new IPEndPoint(IPAddress.Any, 7000);
            server.Bind(ipt);
            server.Listen(20);
            Socket client = server.Accept();

            byte[] buffer = new byte[2048]
            int len = client.receive(buffer);
            client.send(buffer, 0, len);
            
            client.close();
            socket.close();
        }
    }
}

]Client

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
 
namespace client
{
    class Program
    {
        static void Main(string[] args)
        {
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint ipt = new IPEndPoint(IPAddress.Parse("192.168.1.2"), 7000);
            socket.connect(ipt)
 
            string msg = string.Empty;
            byte[] receiverBuff = new byte[2048];
 
            byte[] buffer = Encoding.UTF8.GetBytes(msg);
            sock.Send(buffer);
            int len = sock.Receive(receiverBuff);
            string data = Encoding.UTF8.GetString(receiverBuff, 0, len);
            Console.WriteLine(data);
            
            socket.Close();
        }
    }
}
Client > Hello!
Console > Hello!
반응형