전체 글 (234) 썸네일형 리스트형 [C#] TCP/IP 소켓 프로그래밍_Half-close Half-close 서버가 자원을 전부 전송하면 클라이언트에서 데이터를 수신했다고 전송하는 메시지를 보낸다고 가정하자. 클라이언트가 메시지를 전송하더라도 서버가 close 함수를 사용하면 메시지를 받을 수 없는 상황이 된다. 이 때 close()가 아닌 Shutdown.Send 함수를 사용해서 출력 스트림만 닫고 입력 스트림을 열어놓게 되면 클라이언트의 메시지를 수신할 수 있게 된다. 이처럼 스트림 중 절반만 닫는 것을 Half-close라 한다. [C#] TCP/IP 소켓 프로그래밍_우아한종료 우아한종료 비정상적인 종료가 아닌 4way handshake 방식을 거쳐 종료되는 방식을 우아한 종료라 한다. 우아한종료 함수 public void Shutdown(SocketShutdown how) 두 호스트 간에 소켓이 연결되면 각 호스트 별로 입출력 스트림이 형성된다. 입출력 스트림을 끊어서 send 나 receive 함수를 호출 못하게 하는 함수 - SocketShutdown.Receive : 입력버퍼의 내용을 삭제하고 입력 스트림을 끊는다. - SocketShutdown.Send: 출력버퍼의 내용을 전송한 후 출력 스트림을 끊는다. - SocketShutdown.Both: receive와 send 함수를 동시에 실행하는 것과 같은 역할 public void Close() public void D.. [C#] TCP/IP 소켓 프로그래밍_입출력 버퍼, 슬라이딩 윈도우 버퍼 데이터 통신을 효율적으로 하기 위해 데이터를 일시적으로 저장하는 공간 슬라이딩 윈도우 입력버퍼의 크기가 100byte인데 상대방이 70byte를 보냈다면, 입력버퍼에는 30byte가 남게된다. 이를 ack 패킷에 보낼 때 30byte가 남았다고 Window size에 담아서 보낸다. 받는 사람은 상대방의 입력버퍼에 30byte가 남아있는 것을 알기 때문에 최대 사이즈를 30byte로 보내게 된다. [C#] TCP/IP 소켓 프로그래밍_handshake TCP Header TCP는 데이터의 순서와 도착을 보장하는 신뢰성 있는 프로토콜 데이터를 보낼 때 번호를 붙이는데 이 번호를 Sequence number라 한다. Flags : 현재 세그먼트의 속성 세그먼트 : TCP/IP 4계층 중 인터넷 계층에서 데이터 단위를 패킷이라 하고, 전송 계층에서의 데이터 단위를 세그먼트라 한다. Synchonize : 상대방과 연결을 생성할 때 시퀀스 번호의 동기화를 맞추기 위한 세그먼트 Ack : 데이터를 받을 때마다 확인플래그를 받음으로써 도착을 보장한다. 확인 응답 플래 3-way handshake 연결과정에서 패킷을 총 세번 주고 받음 4-way handshake [암호학] 다중 치환 암호_비제네르(Vigenere) 암호 다중 치환 암호(Polyalphabetic Substitution Cipher) 하나의 문자가 서로 다른 여러 문자로 매핑 비제네르 암호 암호 간격을 문자마다 서로 다른 간격으로 이동시킨 것. 동일한 문자가 각각 다른 문자로 암호화 될 수 있는 다중치환 방식 ex) "ABCDEF" 를 암호화 하기 위해 키로 "BCD"를 사용 1. 키가 평문보다 작다면 평문의 길이만큼 Key를 반복 "BCDBCD" 2. 평문의 각 문자에 매핑되는 Key 문자의 인덱스만큼 문자를 평행 이동 첫 문자가 'A'이고, 매핑되는 Key는 'B' 이므로 'A' + 1 = 'B' 가 암호문자 두번째 문자가 'B' 이고 매핑되는 키는 'C' 이므로 'B' + 2 = 'D' 가 암호문자가 된다. A B C D E F B(+1) C(+2).. [C#] TCP/IP 소켓 프로그래밍_ echo 프로그램 클라이언트가 메시지를 보내면 서버가 클라이언트에게 재전송 하는 프로그램 - 서버 public static void CreateEchoServer() { using (Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) { IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("192.168.30.1"), 20000); serverSocket.Bind(endPoint); serverSocket.Listen(20); using (Socket clientSocket = serverSocket.Accept()) { Console.WriteLine(c.. [C#] TCP/IP 소켓 프로그래밍_ 직렬화, 바이트 오더 직렬화 직렬화 - 메모리상에 있는 객체를 전송/ 저장 가능한 형태로 만드는 것 - 소켓통신에서는 바이트를 많이 사용 역직렬화 - 직렬화된 데이터를 다시 객체의 형태로 만드는 것 //직렬화 int num = 123; byte[] buffer = BitConverter.GetBytes(num); //역직렬화 //buffer라는 바이트 배열을 0번째 인덱스부터 시작해서 4바이트를 읽으라는 의미 int num2 = BitConverter.ToInt32(buffer, 0); - long 타입을 사용한 예제 long은 8byte 짜리 자료형이므로 버퍼의 길이는 8이 나온다. //직렬화 long num = 123; byte[] buffer = BitConverter.GetBytes(num); Console.Write.. [C#] TCP/IP 소켓 프로그래밍_ Socket 객체 생성 - 서버 using System.Net; using System.Net.Sockets; using System.Net.WebSockets; namespace Server; internal class Program { static void Main(string[] args) { // param: 주소체계, 소켓타입 // Stream 은 연결 지향을 의미 Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //엔드 포인트 IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("192.168.30.1"), 20000); //serverSocket.. 이전 1 ··· 24 25 26 27 28 29 30 다음