포스트

Socket 클래스를 이용한 TCP/IP 통신

TCP/IP with socket class

Socket 클래스를 이용한 TCP/IP 통신

C# Socket 클래스를 이용한 TCP 통신

Socket 클래스는 .NET 에서 제공하는 저수준 네트워크 통신 API입니다.
TcpClient, TcpListener 보다 복잡하지만, 더 세밀하게 통신을 제어할 수 있다는 장점이 있습니다.
이번 글에서는 C#에서 Socekt 클래스를 직접 사용하여 TCP 서버/클라이언트를 구현해보겠습니다.

1. TCP 서버 코드

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
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class TcpServer
{
    static void Main()
    {
        // 1. 소켓 생성 (IPv4, TCP, 스트림 타입)
        Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        // 2. 포트 바인딩 및 리스닝
        serverSocket.Bind(new IPEndPoint(IPAddress.Any, 9000));
        serverSocket.Listen(5);
        Console.WriteLine("서버 시작됨. 클라이언트 기다리는 중...");

        // 3. 클라이언트 수신 대기
        Socket clientSocket = serverSocket.Accept();
        Console.WriteLine("클라이언트 연결됨");

        // 4. 데이터 수신
        byte[] buffer = new byte[1024];
        int received = clientSocket.Receive(buffer);
        string message = Encoding.UTF8.GetString(buffer, 0, received);
        Console.WriteLine("수신 메시지: " + message);

        // 5. 응답 전송
        string response = "서버 응답: " + message.ToUpper();
        byte[] responseData = Encoding.UTF8.GetBytes(response);
        clientSocket.Send(responseData);

        // 6. 연결 종료
        clientSocket.Close();
        serverSocket.Close();
    }
}

2. TCP 클라이언트 코드

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
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class TcpClient
{
    static void Main()
    {
        // 1. 서버 접속
        Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        socket.Connect("127.0.0.1", 9000);

        // 2. 메시지 전송
        string message = "안녕하세요 서버님!";
        byte[] data = Encoding.UTF8.GetBytes(message);
        socket.Send(data);

        // 3. 서버 응답 수신
        byte[] buffer = new byte[1024];
        int received = socket.Receive(buffer);
        string response = Encoding.UTF8.GetString(buffer, 0, received);
        Console.WriteLine("서버 응답: " + response);

        // 4. 종료
        socket.Close();
    }
}

포인트 요약

  • SocketTCP/UDP 모두 지원하며, 다양한 설정이 가능하다.
  • 수신 버퍼 크기, SendTimeout, KeepAlive 등 설정을 직접 할 수 있다.
  • 단점은 코드가 길고, 초보자에게 진입 장벽이 있을 수 있음.

주의할 점

  • 클라이언트가 Send() 를 하면 서버에서 반드시 Receive() 가 있어야함.
  • UTF-8 인코딩을 사용하지 않으면 한글이 깨질 수 있음.
  • Socket.Close() 호출 안 하면 포트가 남아서 다음 실행에 방해될 수 있음.

마무리

Socket 클래스를 사용하면 네트워크 통신의 기초부터 확장까지 자유롭게 구현할 수 있습니다.
다만, 비동기 처리나 멀티 클라이언트 처리는 이보다 더 복잡해지기 때문에
다음 포스팅에서는 더 간단하게 구현할 수 있는 TcpClient, TcpListener 클래스를 소개하겠습니다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.