본문 바로가기

반응형

분류 전체보기

(429)
왜 내 TCP는 믿을 수 없을까? TCP는 정말 신뢰성을 보장해주는 프로토콜일까? 정말 책에 쓰인대로 내가 보낸 모든 데이터들은 상대방에게 신뢰성 있게 잘 도착할까? 라는 궁금증을 가지고 인터넷을 검색하던 중 우연히 "bert hubert finally blogs" 의 "The ultimate SO_LINGER page, or: why is my tcp not reliable"라는 흥미로운 글을 발견하여 짧은 영어 실력으로나마 번역을 시도해 보았다. 번역 중간중간 새로 알게 된 지식이나 보충 설명은 주석으로 추가하였으니 읽으면서 참고 부탁드린다. 원문이 궁금하신 분은 다음 링크를 따라가면 영문 버전을 볼 수 있다. https://blog.netherlabs.nl/articles/2009/01/18/the-ultimate-so_linger..
TIME_WAIT vs CLOSE_WAIT TCP 소켓에는 총 11가지의 상태가 있고(netstat를 이용해 소켓의 상태를 보면 CLOSED, LISTEN, SYN_SENT, SYN_RECV, ESTABLISHED, CLOSE_WAIT, LAST_ACK, FIN_WAIT1, FIN_WAIT2, CLOSING, TIME_WAIT..중에 하나가 나온다) 그 중 사람들이 자주 헷갈리는 것이 TIME_WAIT와 CLOSE_WAIT는 요 두가지 상태이다. 오늘은 이 TIME_WAIT와 CLOSE_WAIT, 요 두 상태에 대해 말해 보도록 하겠다. 들어가기에 앞서, 용어 정리를 먼저 하도록 하자. Active Open : connect()를 호출 하는 쪽. 즉, SYN 세그먼트를 전송한 쪽. 종종 클라이언트가 된다. 하지만 100% 클라이언트라고 할 수는 ..
[C++11] 주요 변경/추가 사항 람다 표현식(Lambda Expressions) 람다 표현식은 함수를 선언한 곳에서 바로 호출 할 수 있도록 한다. 람다 표현식은 아래와 같은 형태를 가진다. [capture] (parameters) -> return-type { body } for_each() 알고리즘을 사용하여 문자열을 순회하며 대문자의 개수를 센다고 가정하자. 대문자인지 판단하기 위한 함수 객체를 넘겨 주는 대신 람다 표현식을 사용하면 보다 편리하게 코드 작성이 가능하다. int main() { char s[]="Hello World!"; int Uppercase = 0; //modified by the lambda for_each(s, s+sizeof(s), [&Uppercase] (char c) { if (isupper(c)) ..
boost::asio::spawn이 하는 일은 뭔가요? spawn의 전체적인 과정이 머리속에서 안그려짐. 1. spawn(io_service, my_coroutine)을 호출 했을 때, my_coroutine을 감싸고 있는 새로운 핸들러가 io_service 큐에 추가 되는건가? -> spawn이 호출 될 때, Boost.Asio는 몇몇 셋팅 작업을 거친 후 사용자가 제공한 엔트리 포인트로써의 함수를 사용하는 코루틴을 생성하는 내부 핸들러를 dispatch() 하기 위해 strand를 사용하게 된다. 이런 조건에서, 내부 핸들러는 spawn 내에서 호출 가능하다. 그리고 다른 때는 지연된 호출을 위해 io_service에 post 된다. 2. 코루틴 안에서 인자로 넘어온 yield_context를 호출 했을 때, async operation이 완료 될때 까지..
소켓 프로그래밍 - '네트워크에 중복된 이름이 있기 때문에 연결되지 않았습니다' 윈도우 소켓 프로그래밍을 할때 특히 대량 접속 프로그램을 만들때 저 에러가 뜬다면 프로세스에서 생성 할수 있는 소켓이 한계에 도달했다는 의미다. 프로그램이 active close를 하고 있는지 확인하고, 만일 active close를 하고 있다면 linger option을 꺼줘야 한다. 여기서 active close라는 것은 상대방이 close를 하는 것이아니라 프로그램 자신이 close를 호출하는 것을 의미한다. close를 호출하는 쪽은 TIME_WAIT 상태에 빠지게 되어 일정 시간동안 소켓 리소스를 해제하지 않고 유지하게 된다. 예를 들어 서버라면 수많은 클라이언트들이 접속을 할텐데 그 연결들에 대해 서버가 close를 호출하게 되면 TIME_WAIT에 빠진 소켓들을 다른 클라이언트로 부터의 연결..
MySQL transaction isolation level MySQL의 innoDB에서 제공하는 transaction isolation level. 한글로 하면 '트랜잭션 격리 수준'이라고 한다. 트랜잭션이란? 트랜잭션 격리 수준에 대해 알아보기 앞서, 트랜잭션이 무엇인지 먼저 알아보자. 트랜잭션이란, 데이터베이스의 상태를 변경하기 위해 수행하는 '작업의 단위'라고 정의 할수 있다. 예를 들어 데이터베이스로 부터 select하고 그 결과에 따라 update를 통해 해당 값을 변경하기까지의 모든 과정을 하나의 트랜잭션이라고 할수 있다. 트랜잭션이 하나의 작업 단위로서 올바르게 동작하기 위해서는 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation, 독립성이라고 표현하기도 한다), 지속성(Durability). 이 4가지 조건이 만족..
구글 클라우드 런(Google Cloud Run) 사용해보기 백수가 되어 집에서 빈둥거리다 보니 서버를 하나 만들어서 공부도하고 소소하게 뭔가를 만들어 보고 싶은데 집 PC를 하루종일 켜놓고 있을 수도 없고, 공인 아이피가 아니라 외부에서는 접속도 할수 없다. 그렇다고 aws 같은 유료 서비스를 이용하기에는 비용적으로 부담이 되어 검색하다 보니 구글 클라우드 플랫폼에서 도커 기반 컨테이너를 서버리스 환경에서 운영할 수 있는 클라우드 런이라는 서비스를 발표 했다는것을 알게 되었다. 링크 : "구글, 도커 컨테이너 기반 서버리스 서비스인 클라우드 런 발표 - 44bits 작성" 위 링크를 따라가보면 '클라우드 런'에 대한 소개와 구글에서 제공하는 기본 예제 이미지(그림이 아니고 도커 이미지)로 클라우드 런을 사용해보는 방법에 대해 소개하고 있다. 하지만 예제는 구글 ..
구글/iOS 인앱 결제 서버 검증 - PHP (In-app purchase server side verification in PHP) iOS /* recept { "Store":"AppleAppStore", "TransactionID":"1000000629303951", "Payload":"MIIT+QYJKoZIhvBFja19....BkpGkqEZQbQ8l8fNdoKPFRDc=" } */ function IOSInappPurchaseVerify($recept_from_appstore) { $json = array(); $json["error_code"] = 0; $json["error_message"] = "success"; $json["order_id"] = ""; $json["product_id"] = ""; $json["purchase_date"] = 0; $json["user_seq"] = 0; $json["char_num"] ..
구글/iOS 인앱 결제 서버 검증 - Python (In-app purchase server side verification in Python) iOS import urllib, urllib2 import json import datetime import base64 class IOSInappPurchaseVerifier : url = "https://sandbox.itunes.apple.com/verifyReceipt" password = "PASSWORD" # receipt data should be encoded by base64 def verify(self, receipt, signature) : req = { "receipt-data": receipt,"password": IOSInappPurchaseVerifier.password } headers = {'Content-Type': 'text/Json; charset=utf-8'} re..
[Unity] 콜스택 알아 오기 유니티를 사용하다 보면 디버깅을 위해 로그를 찍을때 리스트 뷰에서는 콜스택에 대한 정보를 볼수 없어 귀찮은 경우가 많다. 어셋 스토에서 판매하고 있는 'Console Pro'라는 어셋을 사용하면 편리하긴하지만.. using UnityEngine; // example : // Debug.Log(LogHeader.Function + "any log text will be here"); // result : // CallStackLogMain:func_2() (at Assets/CallStackLogMain.cs:17) // any log text will be here public static class LogHeader { public static string Path { get { #if UNITY_ED..

반응형