웹 개발/네트워크 (13) 썸네일형 리스트형 [C#] 비동기 프로그래밍_스레드 동기 num이라는 변수를 선언해서 10만씩 더하는 프로그램. 두 개의 스레드를 생성하여 결과값은 20만이 나올 것으로 예상. public static void Run() { int num = 0; Thread t1 = new Thread(() => { for (int i=0; i { for (int i = 0; i < 100000; i++) { num++; } }); t2.Start(); t1.Join(); t2.Join(); Console.WriteLine(num); } 결과 왜 결과값이 20만이 아닐까? 크리티컬 섹션 : 여러 스레드가 동시에 동일한 변수에 접근하면서 문제가 발생... [C#] 비동기 프로그래밍_프로세스, 스레드 프로세스 : 메모리에 적재된 현재 실행중인 프로그램 스레드 : 프로세스 내에서 명령들의 실행 흐름 단위 public static void Run() { Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("192.168.31.1"), 17841); serverSocket.Bind(endPoint); serverSocket.Listen(1000); while (true) { Socket clientSocket = serverSocket.Accept(); Console.WriteLine(cl.. [C#] Nagle 알고리즘 네트워크 상의 패킷 수를 줄임으로써 네트워크 효율성을 높이는 알고리즘 1byte를 보낸다 해도 실제로는 여러 header 정보가 추가되어 수십 바이트를 보내게 된다. 그러므로 1byte를 여러 번 보내는 것 보다 한번에 여러 byte를 보내는 것이 효율적 상대방으로부터 ack를 받고 데이터를 전송 패킷이 줄어들기 때문에 네트워크 효율이 증가하지만 ack를 대기해야 하므로 전송속도가 느리다. [C#] SO_LINGER Close 함수 호출 시 출력버퍼에 전송되지 않고 남아 있는 데이터를 어떻게 처리할 지 알려주는 옵션. 기본동작은 출력버퍼에 남아있는 데이터는 모두 전송을 하고 fin packet을 보낸다. socket.LingerState = new LingerOption(false, 0); 첫번째 인자는 사용여부. true를 줄 경우 남아있는 데이터를 버리고 상대방에게 비정상 종료를 날린다. 두번째 인자에 설정한 시간 내로 FIN에 대한 ACK를 받지 못하면 비정상 종료 [C#] TCP/IP 소켓 프로그래밍_우아한 종료 우아한 종료 4 way handshake 과정을 거쳐 종료하는 것을 우아한 종료라 한다. public void Shutdown(SocketShutdown how) 각 호스트 별로 입/출력 스트림이 형성. 이러한 입/출력 스트림을 끊어서 send나 receive 함수를 호출 못하게 하는 함수 SocketShutdown.Receive : 입력버퍼의 내용을 전부 삭제하고 입력 스트림을 끊는다. SocketShutdown..Send : 출력버퍼의 데이터를 전송한 후 출력 스트림을 끊는다. SocketShutdown.Both : Receive와 Send 두 가지를 동시에 한다. Both와 Send 는 fin 패킷을 보내면서 4way handshke 과정을 유도 Receive는 fin 패킷을 보내지 않는다. pub.. [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 소켓 프로그래밍_handshake TCP Header TCP는 데이터의 순서와 도착을 보장하는 신뢰성 있는 프로토콜 데이터를 보낼 때 번호를 붙이는데 이 번호를 Sequence number라 한다. Flags : 현재 세그먼트의 속성 세그먼트 : TCP/IP 4계층 중 인터넷 계층에서 데이터 단위를 패킷이라 하고, 전송 계층에서의 데이터 단위를 세그먼트라 한다. Synchonize : 상대방과 연결을 생성할 때 시퀀스 번호의 동기화를 맞추기 위한 세그먼트 Ack : 데이터를 받을 때마다 확인플래그를 받음으로써 도착을 보장한다. 확인 응답 플래 3-way handshake 연결과정에서 패킷을 총 세번 주고 받음 4-way handshake 이전 1 2 다음 목록 더보기