C# 으로 하는 소켓 통신 공부
오늘 한 것...
- 로컬 주소로 간단한 서버 구현과 클라이언트 구현
- 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();
- 위와 같은 로직으로 클라이언트와 서버가 서로 소켓 통신을 하게 된다.
- 잡다한 네트워크 지식
네트워크 모델이란 ?
- 로컬 주소로 간단한 서버 구현과 클라이언트 구현
- C# 소켓 기초
- 잡다한 네트워크 지식
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비트 주소 이다.
Author And Source
이 문제에 관하여(C# 으로 하는 소켓 통신 공부), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@taek0e/C-으로-하는-소켓-통신-공부저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)