관리 메뉴

sleepyotter

소켓 프로그래밍 기초 본문

프로그래밍/C# 게임서버

소켓 프로그래밍 기초

sleepyotter. 2021. 9. 7. 21:09

클라

1. 소켓 준비

2. 서버 주소로 connect

3. 1번 소켓으로 통신


서버

1. Listener 소켓 준비

2. Bind(서버주소/port를 listener소켓과 연동)

3. Listen

4. Accept

5. Accept에서 얻은 소켓으로 통신


소켓 프로그래밍을 네트워크 프로그래밍 수업 때 썼던거 같은데, Listener 소켓의 존재와 Accept에서 받은 통신용 소켓의 존재가 굉장히 헷갈렸다.

아니 왜, 바로 Accept소켓으로 받아서 그거로 통신하지 않느냐고... 지금이야 그냥 받아들여졌는데, 이렇게 생각하면 편하다.

Listen 소켓을 하나 두어 들어오는 모든 요청을 이것으로 처리한다. 요청을 처리해서 이상이 없으면 Client - Server 통신용 소켓을 하나 만들어 준다.

뭔가 검문소 같은 느낌으로 Listen소켓이 역할을 하고, 검문소를 한 번 통과하고 나면 내 연락처와 상대방의 연락처를 교환하여 다음부터는 검문소를 통과하지 않고도 연락을 하는? 그런 느낌으로 받아들이면 거부감이 좀 없지 않을까 싶다.


c#에서는 다음과 같이 소켓 프로그래밍을 구현한다.

서버 사이드

1. Listen 소켓 준비. 소켓 생성에서 Stream 과 TCP는 항상 붙어다니는 짝이다.

//Host 알기
string host = Dns.GetHostName();
//DNS로 IP정보 알아내기
IPHostEntry ipHost = Dns.GetHostEntry(host);
//ip주소 뽑아내기
IPAddress ipAddr = ipHost.AddressList[0];
//ip주소와 port번호를 담은 객체 생성
IPEndPoint endPoint = new IPEndPoint(ipAddr, 8080);

//소켓 생성. IP&Port, TCP 설정
Socket listenSocket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

2. Bind

listenSocket.Bind(endPoint);

3. Listen (최대 10명 까지 대기가능. 연결 큐의 최대길이 지정. void로 하면 자동 설정)

listenSocket.Listen(10);

4. Accept

Socket clientSocket = listenSocket.Accept();

5. 이후 작업 예시

//데이터를 받는 버퍼 준비
byte[] recvBuff = new byte[1024];
//데이터 받기
int recvBytes = clinetSocket.Receive(recvBuff);
//데이터 해석. 여기서는 UTF8로 데이터를 인코딩 약속 가정
string recvData = Encoding.UTF8.GetString(recvBuff, 0, recvBytes);


//Data send
byte[] sendBuff = Encoding.UTF8.GetBytes("Welcom to Server !");
clientSocket.Send(sendBuff);

//connection close
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.close();

클라이언트 사이드

1. 소켓 준비 & 3. 이후 하는 일 예시

서버와 같음. 생략

2. 연결

socket.Connet(endPoint);

 

'프로그래밍 > C# 게임서버' 카테고리의 다른 글

Session#1  (0) 2021.09.09
소켓 프로그래밍 - 비동기 연결  (0) 2021.09.09
통신 모델  (0) 2021.09.07
네트워크 기초 이론  (0) 2021.09.07
Thread Local Storage  (0) 2021.09.07