C# 으로 하는 소켓 통신 공부

3202 단어 socketsocket

오늘 한 것...

  • 로컬 주소로 간단한 서버 구현과 클라이언트 구현
  • C# 소켓 기초
  • 잡다한 네트워크 지식

< 서버 코어를 먼저 만들어 볼 것 입니다 ! >

하나의 PC로 통신 하는 예제이므로 해당 코드는 서버와 클라이언트 모두 똑같이 설정 해주었습니다.

string host = Dns.GetHostName();    // Dns 클래스로 Pc의 호스트명을 string으로 받음
IPHostEntry ipHost = Dns.GetHostEntry(host);  
IPAddress ipAddr = ipHost.AddressList[0];  
IPEndPoint endPoint = new IPEndPoint(ipAddr, 7777);  
  • IPHostEntry 클래스 변수 ipHost에 해당 로컬 PC의 IP 주소 관련 여러 정보들이 들어 있고 AddressList[] 형식으로 여러개의 IP 주소를 담고 있습니다.

  • IPAddress 클래스 변수 ipAddr에 AddressList[0] 번째 값을 할당 해주어 첫 번째로 넣어준 로컬 IP 주소가 들어가게 됩니다.

  • IPEndPoint 클래스는 인자로 IP 주소와 포트 번호를 할당 해주어야 합니다. 저는 포트 번호를 7777로 해주었습니다.

서버 코어 구현

Socket listenSocket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
// listenSocket에 IPEndPoint값과 소켓 타입, 프로토콜 설정 (TCP)
            
            
         
listenSocket.Bind(endPoint);

          
// backlog 인수 : 최대 대기수
listenSocket.Listen(10);

 while (true)
 {
     Console.WriteLine("Listening....");

     // 클라이언트를 입장 시킴 (대리인)
     Socket clientSocket = listenSocket.Accept();

     // 클라이언트에서 오는 문자열 패킷 받기.
     byte[] recvBuff = new byte[1024];
     int recvBytes = clientSocket.Receive(recvBuff);
     string recvData = Encoding.UTF8.GetString(recvBuff, 0, recvBytes);
                    
     Console.WriteLine(recvData);

     // 클라이언트에 문자열 보내기
     byte[] sendBuff = Encoding.UTF8.GetBytes("Welcome to Server !");
     clientSocket.Send(sendBuff);

     // 클라이언트 
     clientSocket.Shutdown(SocketShutdown.Both);
     clientSocket.Close();
}
                

클라이언트 구현

Socket socket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
// 클라이언트의 소켓 만들기


// 서버 입장 문의 
socket.Connect(endPoint);
Console.WriteLine($"Connected To {socket.RemoteEndPoint.ToString()}");

// 연결된 서버에 문자열 패킷 전송
byte[] sendBuff = Encoding.UTF8.GetBytes("Connected Client !");
int sendBytes = socket.Send(sendBuff);

 // 서버에서 클라이언트로 오는 문자열 패킷 받기
 byte[] recvBuff = new byte[1024];
 int recvBytes = socket.Receive(recvBuff);
 string recvData = Encoding.UTF8.GetString(recvBuff, 0, recvBytes);
Console.WriteLine($"[From Server] {recvData}");


 // 클라이언트에서 직접 나가기. 
 socket.Shutdown(SocketShutdown.Both);
 socket.Close();

  • 위와 같은 로직으로 클라이언트와 서버가 서로 소켓 통신을 하게 된다.
  • 잡다한 네트워크 지식

네트워크 모델이란 ?

네트워크의 세부 기능들을 매우 복잡하고 다양하기 때문에, 이를 체계적으로 분류한 개념적인 모델을 만들었는데 이를 네트워크 모델이라 한다.

네트워크 모델중 가장 대표적인 모델은 2가지 인데, 전통적인 네트워크 모델인 OSI 7 Layer 모델과 (최근의 네트워크는 거의 대부분은 TCP/IP를 기반으로 하고 있기 때문에) OSI Layer를 단순화한 TCP/IP 모델이 있다.

IP 주소에 대하여..

IP 주소는 인터넷에 연결된 컴퓨터들의 주소로서 크게 가장 많이 사용하는
IPv4 주소와 IPv4의 주소가 모자랄 것을 대비해 만든 IPv6 주소가 있다.
-> IPv4는 32비트 주소이고, IPv6는 128비트 주소 이다.

좋은 웹페이지 즐겨찾기