Server 부분..
현재 서버ip를 지정하는 중..
// DNS (Domain Name System)
//
string host = Dns.GetHostName();
IPHostEntry ipHost = Dns.GetHostEntry(host); // ?
IPAddress iPAddr = ipHost.AddressList[0];
IPEndPoint endPoint = new IPEndPoint(iPAddr, 7777);
위의 ipHost.AddressList가 배열인 이유는 구글 같은 것도 트래픽이 많이 발생하는 것들은 여러 ip를 보유중이다. 그중에서 하나를 내가 IpAddr로 받아오겠다는 의미..
endPoint는 정확한 주소이다 port까지 연결했다(7777)로..
listener 초기화
public void Init(IPEndPoint endPoint)
{
//문지기.
Socket _listenSocket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
//문지기 교육
_listenSocket.Bind(endPoint);
//영업 시작.
_listenSocket.Listen(10);
//backlog : 최대 대기수 (게임이 접속 유저가 많을 때 식당 입구에 최대 몇명이 대기할 수 있느지.
// 대기할 수 있는 수를 초과한 경우 fail이 난다.
SocketAsyncEventArgs args = new SocketAsyncEventArgs();
args.Completed += new EventHandler<SocketAsyncEventArgs>(OnAcceptCompleted);
RegisterAccept(args);
}
listener는 문지기이다. 문지기를 만들고 -> 교육을한 후 -> 영업을 시작하는 순이다.
여기서 비동기방식으로 하기위해서 SocketAsyncEventArgs로 이벤트를 사용했다. 완료를 이벤트 핸들러를 통해서 받는 방법이다.
OnAcceptCompleted가 완료되면 알아서 핸들러가 알려준다.
RegisterAccept 시작하면 낚시대를 던지는 역할이다 Accept를 등록해본다..
RegisterAccept
void RegisterAccept(SocketAsyncEventArgs args)
{
bool pending = _listenSocket.AcceptAsync(args);
if(pending == false)
{
OnAcceptCompleted(null, args);
}
}
- 시작하자마자 낚시대를 던지는 느낌인데 던져서 만약 소켓이 바로 반환되면 OnAcceptCompleted를 호출해준다.
OnAcceptCompleted (accept가 된 상태 )
void OnAcceptCompleted(object sender, SocketAsyncEventArgs args)
{
RegisterAccept(args);
}
Client 부분..
static void Main(string[] args)
{
// DNS (Domain Name System)
//
string host = Dns.GetHostName();
IPHostEntry ipHost = Dns.GetHostEntry(host); // ?
IPAddress iPAddr = ipHost.AddressList[0];
IPEndPoint endPoint = new IPEndPoint(iPAddr, 7777);
//휴대폰 설정 (socket 설정)..
Socket socket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
//보낸다
byte[] sendBuff = Encoding.UTF8.GetBytes("Hello World");
int sendBytes = socket.Send(sendBuff);
//받는다.
byte[] recvBuff = new byte[1024];
}
서버구조의 반대면서, 일단 주소는 정한뒤 -> 휴대폰을 개통하고(socket) 그 후 클라이언트는 보내는 것을 먼저한 후 받는 동작을한다 받을 때 정확한 크기를 몰라서 recvBuff크기를 일단 좀 크게 잡는다.
출처 : 루키스님의 서버강의를 학습 후 작성하였습니다.
'c#_게임서버' 카테고리의 다른 글
mmorpg서버구조 (0) | 2022.07.06 |
---|---|
spinlock, autoResetEvent, ReaderWriterLock (0) | 2022.07.02 |
lock (0) | 2022.06.30 |
멀티쓰레드 (0) | 2022.06.28 |
서버란? (0) | 2022.06.28 |