'network'에 해당되는 글 2건

  1. 2010.08.14 C# 네트워크(Network) TCP 서버 만들어보기 by 아르다

2010/08/14 - [C#/Tip] - C# 네트워크(Network) TCP 클라이언트 만들어보기

서버 <-> 클라이언트 통신(TCP)를 한번 작성해봤습니다.

어렵진 않으니 한번 읽어보시면 될거 같네요..

 

연결 부분은 아래와 같이 코딩하였습니다.

IPEndPoint에 대한 MSDN으 설명을 보게되면 아래와 같은 설명이 있습니다.

IPEndPoint 클래스에는 응용 프로그램에서 호스트 서비스에 연결하는 데 필요한 호스트 정보와 로컬 또는 원격 포트 정보가 포함되어 있습니다. 

IPEndPoint 클래스는 호스트의 IP 주소와 서비스의 포트 번호를 결합하여 서비스에 대한 연결 지점을 형성합니다.

<출처> msdn : http://msdn.microsoft.com/ko-kr/library/system.net.ipendpoint(VS.80).aspx

저도 처음 C#에서 네트워크 코딩을할 때 이게 잘 이해안되던 부분이었는데요.

알고 넘어 가는게 좋겠죠?..

 

Sorket클레스로 만들어진 server Bind메소드를 활용해서 IPEndPoint를 지정해줍니다.아래처럼

IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9999);

 

여기서 또 Bind에 대한 MSDN의 설명을 보게 되면 아래와 같은 설명이 있습니다.

특정 로컬 끝점을 사용해야 하는 경우 Bind 메서드를 사용합니다. Listen 메서드를 호출하려면 먼저 Bind를 호출해야 합니다. 특정 로컬 끝점을 사용해야 하는 경우가 아니면 Connect메서드를 사용하기 전에 Bind를 호출할 필요가 없습니다. 연결 없는 프로토콜과 연결 지향 프로토콜 모두에 대해 Bind 메서드를 사용할 수 있습니다.

<출처> msdn : http://msdn.microsoft.com/ko-kr/library/system.net.sockets.socket.bind(VS.80).aspx

Bind를 활용해서 로컬 끝점과 연결을 합니다.

server.Bind(ipep);

 

그냥 위의 IPEndPoint를따로 생성하지 않고 이렇게 바로 하셔도 상관은 없습니다.

server.Bind(new IPEndPoint(IPAddress.Any, 9999));

 

다음은 Listen메서드로 수신대기 상태를 만들어야 하는데 아래와 같은 구문을 사용합니다.

public void Listen (int backlog)

int backlog는 한번에 접속할 수 있는 클라이언트 수를 뜻합니다.

Listen(5) 라고 했을 경우 5개의 클라이언트가 동시접속 가능하다는 뜻입니다.

 

Listen으로 수신대기 상태에 들어가게되면 클라이언트에서 연결 요청이 들어오게 되면

Socket클레스로 연결된 클라이언트를 반환하게 됩니다.

 

반환된 Socket클레스를 통해서보내고자 하는 데이터(byte) 또는 string을 보내게됩니다.

 

C#에서 네트워킹 서버는 위와 같은 단계로 진행되게 됩니다.

아래는 위의 설명을 코드로 나타내어 봤습니다. 구분하기 쉽게 메서드를 작성해봤는데 더 어지러운거 같기도 하고..그렇네요..^^;

    class NetworkTest
    {

        private Socket server;
        private Socket client;

        private void ServerOpen()
        {

            server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9999);
            server.Bind(ipep);
            server.Listen(5);
            
            Console.WriteLine("클라이언트 연결을 대기합니다.");

            client = server.Accept();

            for (int i = 0; i < 10; i++)
            {
                Console.Write("클라이언트로 보낼 내용은 ==> ");
                string str = Console.ReadLine();
                Writer(str);
            }
        }

        private void Writer(string str)
        {
            NetworkStream stream = new NetworkStream(client);
            StreamWriter writer = new StreamWriter(stream);

            writer.WriteLine(str);
            writer.Flush();
        }


        static void Main(string[] args)
        {
            NetworkTest networktest = new NetworkTest();

            networktest.ServerOpen();
            Console.ReadLine();
        }
    }
Posted by 아르다