(C# : Server) 소켓 프로그래밍

Posted by : at

Category : Charp-Server



// ServerCore

class Program
{
    static void Main(string[] args)
    {
        // DNS(Domain Name System)을 사용할 예정
        // ip addr를 안쓰고 도메인네임을 쓰겠다는 말.
        string host = Dns.GetHostName();
        IPHostEntry ipHost = Dns.GetHostEntry(host);
        IPAddress ipAddr = ipHost.AddressList[0];
        IPEndPoint endPoint = new IPEndPoint(ipAddr, 7777/* Port */);

        Socket listenSocket = new Socket(endPoint.AddressFamily, 
                                        SocketType.Stream, ProtocolType.Tcp); /* TCP로 사용하겠다는 선언 */

        try
        {
            listenSocket.Bind(endPoint);

            listenSocket.Listen(10);    // 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($"[From Client] {recvData}");

                // 보내는 부분
                byte[] sendBuff = Encoding.UTF8.GetBytes("Welcom to MMORPG Server ");
                clientSocket.Send(sendBuff);

                // 소켓을 닫는다
                clientSocket.Shutdown(SocketShutdown.Both); /*소켓을 닫는다를 미리 공지*/
                clientSocket.Close();   /*실제로 닫는 부분*/
            }
        }
        catch(Exception e)
        {

        }
    }
}
// Client

class Program
{
    static void Main(string[] args)
    {
        string host = Dns.GetHostName();
        IPHostEntry ipHost = Dns.GetHostEntry(host);
        IPAddress ipAddr = ipHost.AddressList[0];
        IPEndPoint endPoint = new IPEndPoint(ipAddr, 7777/* Port */);

        Socket socket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

        try
        {
            socket.Connect(endPoint);
            Console.WriteLine($"Connected To {socket.RemoteEndPoint.ToString()}...");

            // 보내는 부분
            byte[] sendBuff = Encoding.UTF8.GetBytes("Hello World!");
            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();
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
    }
}

About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links