프로그래밍/의문
-
클라이언트의 shutdown send는 서버에 eof를 전달한다.프로그래밍/의문 2016. 2. 6. 23:51
graceful close를 위한 과정 클라이언트 (0) 소켓의 송신 스트림을 닫음 shutdown(send)(4) 서버의 eof 인지(5) 소켓 닫음 서버 (1) 클라이언트로부터 eof를 인지. 클라이언트로 부터 받을 데이터가 없으므로 더이상 수신 받지 않는다. socket.shutdown(receive)(2) 남은 데이터들을 모두 보냄.(3) 클라이언트와 연결된 소켓의 송신 스트림을 닫음 socket.shutdown(send)(5) 소켓 닫음 따라서 서버는 클라이언트로 오는 eof가 소켓의 오류, 종료와 직접적으로 같은 건 아니다.사실, 서버는 클라이언트로 부터 eof를 받았다고 하더라도 서버는 송신을 할 수 있다. eof != disconnect
-
1바이트는 왜 8비트일까?프로그래밍/의문 2016. 2. 2. 22:30
컴퓨터가 처리하는 정보의 최소단위. 비트보다 높다. 옛날에는 4비트, 6비트를 1바이트로 삼는 컴퓨터도 있었으나, 현대(적어도 1984년 이후)의 대개의 컴퓨터 아키텍처에서, 1옥텟, 즉 8비트로 1바이트를 삼는다. 표준 C 언어에서는 '8비트 이상'을 1바이트로 삼도록 규정하고 있다. "byte"는 1956년에 Dr. Werner Buchholz에 의해서 사용되었고, 이는 IBM의 IBM scratch computer를 디자인하는 동안 사용되었다. 이때는 4bit를 1byte로 설계되었다고 한다. 전형전인 I/O장비는 6bit를 1byte로 사용하다가, 나중에 System/360에 8bit를 1byte를 사용하기 시작하면서, 규격이 정해지고 표준화 되었다. 일정한 개수의 비트로 이루어진 연속된 비트열...
-
iocp 송신 관련 주의점프로그래밍/의문 2016. 1. 26. 17:58
http://www.gpgstudy.com/forum/viewtopic.php?p=43020 질문 IOCP에서 Recv 할 때는 당연히 버퍼(큐)를 만들어서 저장 후 패킷 처리를 하고 있습니다. 그런데, Send 할 때는 어플리케이션 레벨의 별도의 버퍼를 궂이 만들 필요가 있는지 궁금합니다. 다시 말해서, Q1. 소켓 옵션으로 설정해 준 크기 만큼의 버퍼만이 IOCP에서 관리되는 것인지? Q2. 그래서, 아주 많은 Send 오퍼레이션이 요청될 경우, 버퍼 오버플로우로 Send가 실패할 수도 있는지? (WSASend()를 콜(비동기) 할 때, 패킷 데이터를 소켓 버퍼로 즉시 메모리 카피 해버리는지.. 그래서 카피에 실패하면 전송 실패를 리턴하는지..) Q2 같은 경우, 전송 실패가 리턴되지 않는다면, Se..
-
strand로 동기화를 하려는데, 문제가 있다.프로그래밍/의문 2015. 12. 1. 15:51
strand로 동기화를 하려는데 문제가 있다. 2015년 12월 1일 화요일15:27 mutex 대신 모든 동기화를 strand로 하고자 했는데 난처한 문제가 생겼다 게임 관리자와 게임 방은 각자의 strand를 동기화 개체로 활용한다.유저는 게임 관리자에 접속해서 게임 방으로 이동한다.근데 이 게임 관리자 => 게임 방 이동 시에 문제가 있었다. 발생 예측 상황은 방 입장이 처리되기 전에, 유저의 연결이 끊겨버릴 때 발생한다. 유저게임 관리자게임 방 [게임 관리자]는 유저의 접속을 처리한다.[유저]는 방 입장을 요청한다.[게임 관리자]는 유저 방 입장을 등록한다.[유저]는 연결을 끊는다. 유저의 관찰자들에게 연결 끊김을 통보한다.[게임 관리자]는 연결 끊김을 등록한다.[게임 관리자]는 유저 방 입장을 ..
-
코드 안에 if~else 구문이 많다는 건 다른 성격의 것들을 한 데에 모아놨다는 것이다.프로그래밍/의문 2015. 11. 14. 09:48
매치를 만드는 클래스가 있었다. 유저의 레이팅에 따라 매치를 만들어주는 그런 정도는 아닌, 특정 모드를 원하는 유저가 n명이 될 때 매치를 만들어주는 그런 클래스였다. 그런데 매치를 등록하는 부분이 뭔가 이상해져가는 ㅡㅡ; 느낌이 들었다.다음은 그 문제의 코드이다. 1234567891011121314151617181920212223242526 switch (mode) { case soc::gamemode::v2: { v2users.push_back(info); if (v2users.size() == 4) { } } case soc::gamemode::v3: { v3users.push_back(info); if (v3users.size() == 6) { } break; } case soc::gamemode..
-
간결하고 깨끗한 코드 vs 높은 성능프로그래밍/의문 2015. 11. 11. 15:54
간결하고 깨끗한 코드 vs 높은 성능 C++의 강력함 중 하나는 매우 높은 성능의 코드를 작성하는 것이 가능하단 겁니다.그건 우리는 항상 성능에 대한 고민과 걱정을 해야 한다는 걸까요? 퍼포먼스를 위해 간결한 코드를 저버리고 복잡하고 지저분한 코드를 사용하는 게 옳은 걸까요?모두 기본적으로, 간단하고 깨끗한 코드를 쓰길 원합니다. 맞아요 그건 꽤 분명하죠. 퍼포먼스는 효율적인 것이 아니다. 우리는 효율과 퍼포먼스의 차이를 구분해봅시다. 무슨 차이점이 있을까요?그 길을 얼마나 빠르게 갈지 vs 얼마나 걸릴지로 예를 들어보죠.언뜻 보기에(at first glance), "그게 그거 아냐?" 할 수 있겠지만 조금 다릅니다.단적인 예로, 효율성은 당신이 A에서 B로 간다고 할 때 짧은 길로 가는걸 의미합니다.퍼..
-
ODBC BindParametert 사용 시 문자열의 길이로는 SQL_NTS를 넣어줘야 한다.프로그래밍/의문 2015. 10. 28. 20:27
내가 실행할 쿼리 const char* query = "{ call get_account_info_by_id ( ? ) }"; 인자로는 유저의 id를 받는다. 그리고 유저의 계정 정보를 반환한다. 그런데 쿼리는 정상적으로 실행이 되는데, fetch의 반환 값이 SQL_NO_DATA인 것이었다. 왜지? 존재하는 유저로 요청을 했는데? 여기저기 검색을 해서 찾아봤는데, SQLBindParameter에 문자열을 쓰려면(출력 또는 입력으로) SQL_NTS를 인자를 줘야한다는 내용이 보였다. 그리고 정말 되나 실행해봤는데 검색이 정상적으로 되더라. 123456789 connector.prepare(query); // 쿼리의 출력 인자를 설정합니다. SQLINTEGER procreslen = SQL_NTS; // ..