본문 바로가기

C#

C# - 네트워크 , Socket , TCP소켓 대해 알아보자

반응형

using System;
using System.Net;
using System.Net.Sockets;

class Program
{
    static void Main(string[] args)
    {   //Socket Server - 어서 오십시오 하는 소켓 (밑에 소켓 하나 더있다)
        Socket Server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        //한꺼 번에 건물을 올려주는 변수 선언
        //1,2,3층을 한꺼번에 아우르는 기능이 들어 있다.
        Server.Bind(new IPEndPoint(IPAddress.Any, 7000));
        //아이피와 포트를 확인하고 SOCKET과 같이 묶어주는게  Bind 기능 ! 
        //IPAddress.Parse("192.168.0.164") -> 번호를 치기 귀찮아서 
        //코딩한는 방법은 2가지지만 나같아도 any를 쓰겠다. 
        Server.Listen(100);
        //리슨 100은 쫌 에바다 ! 일반적으로 10 정도 100은 자원 낭비 

        //Socket Client - 안에서 서비스 미친듯이 제공하고 있음!
        Socket Client = Server.Accept(); // 블로킹 함수 | 넌블로킹 
        Console.WriteLine("Client Incomming");
        //오 근대 이상하다 왜 소켓이랑 아이피 랑 포트가 없지 ? - > 윈도우가 랜덤으로 만들어 준다.

        byte[] Buffer = new byte[] { 65, 66, 67, 68 }; // Telnet은 2byte로 해석 못함 1byte ASCII코드로 해석
        Client.Send(Buffer);


        Client.Close();
        Server.Close();
    }​
using System;
using System.Net;
using System.Net.Sockets;

class Program
{
    static void Main(string[] args)
    {
        Socket Server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        //한꺼 번에 건물을 올려주는 변수 선언
        //1,2,3층을 한꺼번에 아우르는 기능이 들어 있다.
        Server.Bind(new IPEndPoint(IPAddress.Any, 7000));
        //아이피와 포트를 확인하고 TCP와 같이 묶어주는게  Bind 기능 ! 
        //IPAddress.Parse("192.168.0.164") -> 번호를 치기 귀찮아서 
        //코딩한는 방법은 2가지지만 나같아도 any를 쓰겠다.
        Server.Listen(100);

        Socket Client = Server.Accept(); // 블로킹 함수 | 넌블로킹 
        Console.WriteLine("Client Incomming");

        byte[] Buffer = new byte[] { 65, 66, 67, 68 }; // Telnet은 2byte로 해석 못함 1byte ASCII코드로 해석
        Client.Send(Buffer);


        Client.Close();
        Server.Close();
    }

TCP - 파일 다운

UDP - 영상 시청 (스트리밍)

 

왜 이럴까 ? 

TCP 는 전송되는 데이터의 지속적인 확인 과정이 포함되어 있기 때문에 느려진다.

 

TCP는 들어오는 데이터를 작게 잘라 번호를 매긴다. 

순서에 맞게 데이터를 정렬하여 최종적으로 100%의 데이터를 완성한다. 

오지 않은 데이터는 다시 보내달라고 요청을 한다. 

 

UDP

동일하게 데이터를 짤라서 받는다 근대 순서가 있지만 순서에 맞게 오지 않은 정보는 없는걸로 쳐버린다.

그래서 길에서 동영상을 받아 볼때 영상이 끊기면 슬러간 영상으로 부터 다시 보여진다! 

 

*영상 쪽은 모두 UDP 유튜브! 

 

 

using System;
using System.Text;
using System.Net;
using System.Net.Sockets;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("1");
        Socket Server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        Console.WriteLine("2");
        Server.Bind(new IPEndPoint(IPAddress.Any, 7000));
        Console.WriteLine("3");
        Console.ReadLine();
        Console.WriteLine("4");

        Server.Close();
    }
}

 

7000 포트가 사용되고 다시 7000포트를 또 사용할려고 하면 애러 나버린다. ! 

 

Listen Socket 이된다. 

 

 

srvSocket.Listen(10) -> 입구 넓이를 나타내는 10 한꺼번에 문에 들어올 수 있는 수인데 

10명이 접속 하는게 아니라 입구 크기는 동일한데 입구 앞에 대기석이 9자리 있다는 뜻 

 

통신 상태 ->나가면 Close 

 

 

손님 받는 서버가 코드가 더 길다 . ! 클라이언트는 대기를 탈 필요도 없고 Accept 도 없어도 된다.  

 

 

 

 

들어 갈때 는 IP 7000번에 포드는 80으로 고정 되어 있지만 

 

SOCKET SERVER에 접속하여 ACCEPT 가 되면 

 

다른 IP와 포트로 옮겨가는데 사람을 기만한다.

 

using System;
using System.Net;
using System.Net.Sockets;

class Program
{
    static void Main(string[] args)
    {   //Socket Server - 어서 오십시오 하는 소켓 (밑에 소켓 하나 더있다)
        Socket Server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        //한꺼 번에 건물을 올려주는 변수 선언
        //1,2,3층을 한꺼번에 아우르는 기능이 들어 있다.
        Server.Bind(new IPEndPoint(IPAddress.Any, 7000));
        //아이피와 포트를 확인하고 SOCKET과 같이 묶어주는게  Bind 기능 ! 
        //IPAddress.Parse("192.168.0.164") -> 번호를 치기 귀찮아서 
        //코딩한는 방법은 2가지지만 나같아도 any를 쓰겠다. 
        Server.Listen(100);
        //리슨 100은 쫌 에바다 ! 일반적으로 10 정도 100은 자원 낭비 

        //Socket Client - 안에서 서비스 미친듯이 제공하고 있음!
        Socket Client = Server.Accept(); 
        // 블로킹 함수 - 넌블로킹 
        Console.WriteLine("Client Incomming");
        //오 근대 이상하다 왜 소켓이랑 아이피 랑 포트가 없지 ? - > 윈도우가 랜덤으로 만들어 준다.

        byte[] Buffer = new byte[] { 65, 66, 67, 68 }; 
        // Telnet은 2byte로 해석 못함 1byte ASCII코드로 해석
        Client.Send(Buffer); 
        //Telnet 으로 보내버린다 -> 받으면 아스키코드로 변경 -> A,B,C,D


        Client.Close();
        Server.Close();
    }
}

server

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class Program
{
    static void Main(string[] args)
    {   
        Socket Server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    
        Server.Bind(new IPEndPoint(IPAddress.Any, 7000));
       
        Server.Listen(100);
       
        Socket Client = Server.Accept();
       
        Console.WriteLine("Client Incomming");
     

        byte[] Buffer = new byte[1024];
       
        int Num = Client.Receive(Buffer);
        Console.WriteLine(Num);

        
        Client.Send(Buffer);
      


        Client.Close();
        Server.Close();
    }
}

client

 

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class Program
{
    static void Main(string[] args)
    {   //Socket Server - 어서 오십시오 하는 소켓 (밑에 소켓 하나 더있다)
        Socket Server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        //한꺼 번에 건물을 올려주는 변수 선언
        //1,2,3층을 한꺼번에 아우르는 기능이 들어 있다.
        Server.Connect(new IPEndPoint(IPAddress.Parse("192.168.0.114"), 7000));
        //아이피와 포트를 확인하고 SOCKET과 같이 묶어주는게  Bind 기능 ! 
        //IPAddress.Parse("192.168.0.164") -> 번호를 치기 귀찮아서 
        //코딩한는 방법은 2가지지만 나같아도 any를 쓰겠다. 

        //리슨 100은 쫌 에바다 ! 일반적으로 10 정도 100은 자원 낭비 
        byte[] Buffer = Encoding.UTF8.GetBytes("안녕하세요");
        Server.Send(Buffer);
       

        Buffer = new byte[1024];
        
        int Num= Server.Receive(Buffer);
        Console.WriteLine(Encoding.UTF8.GetString(Buffer,0,Num));

        
        //Telnet 으로 보내버린다 -> 받으면 아스키코드로 변경 -> A,B,C,D


     
        Server.Close();
    }
}

반응형