본문 바로가기
공부,일/C# 네트워크

1:1 채팅 만들기 socket

by fromnothing1 2021. 8. 17.

https://docs.microsoft.com/ko-kr/dotnet/api/system.net.sockets?view=net-5.0 

 

System.Net.Sockets 네임스페이스

네트워크 액세스를 엄격하게 제어해야 하는 개발자를 위한 Winsock(Windows 소켓) 인터페이스에 대해 관리되는 구현을 제공합니다. Provides a managed implementation of the Windows Sockets (Winsock) interface for develo

docs.microsoft.com

마이크로 프로세스 소켓 API 를 사용할꺼임 

 

방법: 소켓 만들기 | Microsoft Docs

 

방법: 소켓 만들기

원격 디바이스와 통신하도록 소켓을 초기화하는 방법을 알아봅니다. Socket 클래스를 사용하여 주소 패밀리, 소켓 형식, 프로토콜 유형을 지정합니다.

docs.microsoft.com

UNIX Network Programming Vol.1 (3판)  저자 W. Richard Stevens 

 

UNIX Network Programming Vol.1 (3판)

유닉스 환경의 네트워크 프로그래밍을 다루는 책으로 알려진 원서의 번역서이다. 특히 IPC라고 불리는 Interprocess Communications 프로그래밍 개발 방법에 대해 중점적으로 다루고 있다. 프로세스들

www.aladin.co.kr

이 책 좋음 (원보이 좋음 ) 

MS 네트워크 참조 주소.txt
0.00MB

 

3 way handshake  연결을 위한 3가지 단계 

4 way handshake closing 을 위한 4가지 단계 

https://hyoje420.tistory.com/4

 

[Network]3-Way Handshake

클라이언트와 서버가 TCP소켓으로 연결할때 서로의 연결상태를 3단계로 확인하는 것이 3-Way Handshake다. 이를 이해하려면 먼저 TCP소켓의 특징에 대하여 알아야할 필요가 있다. TCP는 연결 지향 소켓

hyoje420.tistory.com

 

위의 블로그는 4way hand shake 에 대해서도 설명하고 있다. 

 

서버측 c# 예제 코드 

using System;
using System.Net;
using System.Net.Sockets;

namespace NetSocket_20210817_001
{
    class Program
    {
        static void Main(string[] args)
        {

            Socket aSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);

            IPEndPoint endpoint = new IPEndPoint(0, 5000); // 포트 번호랑 ip(0.0.0.0) 만듬 
            Console.WriteLine("아이피 번호 , 포트 번호 : " + endpoint);

            aSocket.Bind(endpoint); // 소캣 바인딩 

            aSocket.Listen(5); // 리슨중 ...... -> 서버측 소캣으로 동작 리슨은 서버만 하니깐
            Console.WriteLine("클라이언트 접속 대기중 .....");
            Socket aClient = aSocket.Accept(); // 대기 상태의 클라이언트 소캣과 연결 , 즉 클라이언트가 올 때까지 대기(블록킹메소드)
            //accept 시 server 측 소캣을 복사(accept 소캣)해서 클라이언트 소캣과 연결한다 즉 어셉트 할때마다 소캣을 새로만든다. 
            // 서버소캣(랑데뷰 소켓이라한다.)은 직접 연결하지 않는다. 
			
            // 통신 ............


            Console.WriteLine("클라이언트 접속 대기중 .....");
            aClient.Close(); // 클라이언트 소캣 종료 
            aSocket.Close(); // 서버 소캣 종료 
        }
    }
}

 

위 코드를 2번 실행해 보면 2번째에서는 binding 에서 에러가 발생한다. 

port 는 1 프로세스에만 존재하고 동일한 port 번호가 2개일 수 없기 때문에 위와 같은 에러가 발생한다.

 

 

console 을이용한 간단한 서버 클라이언트 코드

 

서버

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace NetSocket_20210817_001
{
    class Program
    {
        static void Main(string[] args)
        {
            byte[] aData = new byte[256];
            int byteCount; // 수신받은 데이터의 byte크기 
            string receivedString;
            Socket aSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            aSocket.Bind(new IPEndPoint(0, 5000)); 
            aSocket.Listen(5);
            
            Console.WriteLine("클라이언트 올 때까지 대기중 .....");
            Socket aClient = aSocket.Accept();
            Console.WriteLine("클라이언트 접속완료");

            // 통신 ............
            while (true)
            {
                byteCount = aClient.Receive(aData, 0, aClient.Available, SocketFlags.None);
                if (byteCount > 0)
                {                    
                    receivedString = Encoding.UTF8.GetString(aData, 0, byteCount);
                    if (aData[0] == 'q')
                    {
                        break;
                    }
                    Console.WriteLine ( "수신 받은 byte size : " + byteCount + " 데이터 string " + receivedString);
                }
            }

            Console.WriteLine("서버 종료");
            aClient.Close();
            aSocket.Close(); // 랑데뷰  소캣 종료 
        }
    }
}

 

클라이언트

using System;
using System.Net.Sockets;
using System.Text;

namespace NetSocket_client_001
{
    class Program
    {
        static void Main(string[] args)
        {
            byte[] aData = new byte[256];
            string aString;
            Socket aSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            Console.WriteLine("서버 접속 시도중");
            aSocket.Connect("127.0.0.1", 5000);
            Console.WriteLine("서버 접속성공");
            // 통신 ............
            while (true)
            {
                Console.Write("입력 : ");
                aString = Console.ReadLine();
                aData = Encoding.UTF8.GetBytes(aString); 
                aSocket.Send(aData, aData.Length, SocketFlags.None);

                if (aData[0] == 'q')
                {
                    break;
                }
            }

            Console.WriteLine("서버 종료");
            aSocket.Close(); // 랑데뷰  소캣 종료 
        }
    }
}

 

 

댓글