IOCP에 관한 자료는 네이버를 검색해도 꽤 많이 나온다(IOCP가 최신 기술은 아니니...)

그런데 대부분 IOCP를 사용한 예제는 쉽게 찾기 힘들다.

그래서 설명을 보고 실제 구현을 해볼 때 좀 망막할 수 있다.


IOCP를 처음 구현해보는데 시작이 잘 안되는 경우 아래의 프로젝트를 기반으로 해보기 추천한다.

이것은 넥스트에서 게임서버 수업 때 사용한 자료이다.


fixme_degiyamIOCP

https://github.com/jacking75/fixme_degiyamIOCP


'온라인 서버 제작자 모임'에 degiyam 이라는 닉네임의 개발자분이 오래 전에 공개한 것이다.

컨텐츠 구현 부분이 거의 없고, 클라이언트도 간단하게 있어서 분석하고 테스트 하기 좋다.

또 윈도우 서비스 모드와 콘솔 모드를 동시에 지원하는 프로그램 개발할 때 참고하기도 좋다.


fixme_MyFirstGameServer

https://github.com/jacking75/fixme_MyFirstGameServer


본인이 오래 전에 첫 서버 프로그래머로 처음으로 만든 온라인 게임 서버 이다.

처음 개발한 것이라서 지금 보면 문제점이 많다.

실제 게임 컨텐츠가 구현되어 있고, 코드가 C 언어스러워서 위의 프로젝트 보다 분석하기 쉽지 않을 것이다.



온라인 상으로 질문에 대한 답변을 하기에는 내 시간이 너무 소요 될 것 같아서 받지 않는다. 

꼭 물어보고 싶다면 판교 테크노밸리까지 오기 바란다^^;;;



저작자 표시
신고
by 흥배 2016.11.28 08:00

C++로된 프로그램과 C#으로 만든 프로그램이 서로 패킷을 주고 받는 경우 외부 라이브러리를 사용하거나 C# 기본 기능을 사용한다.
외부 라이브러리로  CGDBuffer, protobuf, msgpack 등을 사용하거나 아니면 아래와 같이 직접 한다.

 

 

(C++)
// 패킷 헤더
struct PktHeader
{
 short PacketID;
 short BodySize;
};

 

// 로그인 패킷
struct PktReqLogin
{
 char UserID[17];
 char UserPW[17]
};

 

struct PktResLogin
{
 short ErrorCode;
};

 

 


[ C++ 서버로 패킷 보낼 때 ]
short packetID, string userID, string userPW;

 

var asciiUserID = System.Text.Encoding.Default.GetBytes(userID); // 멀티바이트 문자열. 유니코드 문자열은  System.Text.Encoding.Unicode.GetBytes
var dataUserID = new byte[16+1];
Buffer.BlockCopy(asciiUserID, 0, dataUserID, 0, asciiUserID.Length);

 

var asciiUserPW = System.Text.Encoding.Default.GetBytes(userPW);
var dataUserPW = new byte[16 + 1];
Buffer.BlockCopy(asciiUserPW, 0, dataUserPW, 0, asciiUserPW.Length);

 

List<byte> dataSource = new List<byte>();
dataSource.AddRange(BitConverter.GetBytes(packetID)); // 패킷 ID
dataSource.AddRange(BitConverter.GetBytes((Int16)(dataUserID.Length + dataUserPW.Length))); // 패킷 데이터(body)의 크기
dataSource.AddRange(dataUserID);
dataSource.AddRange(dataUserPW);

 

var send_data = dataSource.ToArray() // byte[]로 변환

 

 

[ C++ 서버에서 패킷 받았을 때 ]
var recvData = Network.Receive(); // receive로 데이터 받음

 

var packet = new PacketData();
packet.PacketID = BitConverter.ToInt16(recvData, 0);
packet.DataSize = BitConverter.ToInt16(recvData, 2);
packet.BodyData = new byte[packet.DataSize];

 

var errorCode = BitConverter.ToInt16(packet.BodyData, 0);
      

 

struct PacketData
{
 public Int16 PacketID;
 public Int16 DataSize;
 public byte[] BodyData;
}

 

 

 

이것 이외에도 방식은 있으니 구글링도 해보기 바란다

 

저작자 표시
신고
by 흥배 2016.09.05 08:00

이름 해석(name resolution)에서 DNS 서버의 응답이 512 바이트를 넘을 경우 DNS 서버는 DNS 메시지를 512 바이트 이하로 줄이다. 그 때 압축이 발생했음을 표시하는 "TC 비트"set 한 응답을 돌려준다. TC 비트가 set된 응답을 받으면 송신원은 같은 문의를 TCP로 다시 보낸다. 이 일련의 교환을 "TCP 폴 백"이라고 부른다. 이것으로 65535 바이트까지 DNS 메시지 수신이 가능하다.

 

DNS에서는 TCP 사용에 의해서 발생하는 비용과 지연을 피하기 위해 갑자기 TCP로 문의하지 않고 UDP 에서 시행한 후에 TCP를 이용해야 한다고 규정되어 있다(RFC 5966에서 정의)

  

출처: http://www.atmarkit.co.jp/ait/articles/1510/28/news014.html

 

 

 

DNS의 문의에 대한 답변이 512byte를 넘는 경우에 UDP 프로토콜이 아니라 TCP 프로토콜에 의해서 응답하는 것을 말한다.

 

udp/53에 문의한 것에 왜 TCP 프로토콜로 응답하는가?

- MTU의 최소치인 576byte DNS 응답 패킷으로서는 512 byte(현재는 576 byte라는 경로는 거의 없고 1980년 당초의 사정을 사용하고 있다)를 넘어 버리면 경로에 따라서는 패킷이 분할된다. 1 패킷으로 처리될 수 있도록 RFC 1035에서 512 byte 이하의 응답 패킷으로 제한한다고 규정한다. 그래서 512 byte를 넘는 경우에는 TCP 프로토콜으로 응답한다.

 

비고

DNS 클라이언트(resolver) udp 프로토콜의 임의의 포트를 바인드 해서 문의하고 있으며 응답이 있을 때까지 바인드 한다. DNS 서버는 송신원 포트를 송신지 포트로 하고 송신원 포트를 53번 포트로 응답하는 것으로 도중의(내 통신을 제한하는) F/W를 통과할 수 있도록 설정되어 있고(라는 것이 일반적이다), resolver는 응답을 받을 수 있다. TCP 폴 백 할 경우 UDP 응답 패킷에서 TCP 프로토콜에 의해서 다시 접속 확립이 이뤄지고 TCP 프로토콜에 의해서 응답한다

  

출처: http://blog.development-network.net/ung/2011/07/tcp.html

 

저작자 표시
신고
by 흥배 2015.11.04 08:00

내용이 너무 좋아서 넷텐션의 배현직 대표님의 강연 자료 공유합니다.

네트워크 프로그래밍을 한다면 가장 기본적으로 알고 있어야 할 것을 간단 명료하게 잘 정리 하였습니다.




저작자 표시
신고
by 흥배 2014.11.06 16:52





























튜토리얼

http://www.pushframework.com/?page_id=6


Client-server using the Google Protobuf protocol

http://www.pushframework.com/?page_id=385


공식 사이트

http://www.pushframework.com/

Push Framework - A C++ toolkit for high performance server development

http://www.codeproject.com/Articles/172241/Push-Framework-A-Cplusplus-toolkit-for-high-perfor

A C++ Websocket server for realtime interaction with Web clients

http://www.codeproject.com/Articles/371188/A-Cplusplus-Websocket-Server-For-realtime-interact


저작자 표시
신고
by 흥배 2014.10.10 08:00

번역 하면서 약간 조정했음.

 

라이브러리

URL

한마디 코멘트

boost::asio

Boost.Asio - 1.53.0

· C++ 거의 모든 것을 STL Boost 충분하다.
네트워크 만을 위해서 boost를 사용하기에는 .... 라는 사람에게는 비추
· 바이너리가 아주 크다.
닭 잡는데 소 잡는 칼 사용하는 듯

cpp-netlib

cpp-netlib: The C++ Network Library

· boost.asio 한번 더 래핑 같다
· SSL
· 실용적인지는 모름

ACE

The ADAPTIVE Communication Environment (ACE)

·일단 클라이언트 용도 있지만 기본적으로 서버 사이드 라이브러리.
닭 잡는데 소 잡는 칼 사용하는 듯.
언젠가는 보고 싶은 라이브러리 중 하나. 이러한 프레임워크를 용하여 거대한 시스템을 구축 하고 싶음. Corba라는 단어에서 낡은 티가 나고 있음

Qt

Qt - Cross-platform application and UI development framework

·Qt 애플리케이션을 사용하고 있다면 Qt 극진한 네트워크 지원이 있을
. 
유감이지만 나는 wxWidgets

wxWidgets

wxWidgets: Cross-Platform GUI Library

네트워크 처리는 미묘하게 빈약

메인 클래스가 되는 wxHttp에는 proxy 지원이 없다(wxHttp::SetProxy라는 이름은 있지만 protect 가상 함수이므로 사용할 없다).
HTTP GET
만이라면 쓸만한 듯.
· wxSocketClient에서 POST 처리를 할 수 있지만 코드가 더러워진다.
SSL 
대응하지 않음.

wxCurl

wxCode - wxCURL

· curl 의존하기 싫을지도... Makefile. am 비정상적으로 복잡
· 라지만 이건 Curl.
· Proxy 대응하지 않음.
SSL
대응하지 않음.

C++ Sockets

C++ Sockets Library: Unix & Windows networking made easy

·종속 관계도 적고 왠지 좋음.
구조적으로 MinGW에서 빌드할 수 없다

POCO C++Libraries

Overview | POCO C++ Libraries

네트워크 한정이 아닌 종합적인 C++ 라이브러리. 어느 쪽인가 하면 서버 사이드에 가까운 듯

commonc++

hyperrealm.com - commoncpp

· C++의 종합적인 라이브러리 같음. 네트워크는 ?

YAMI4

Inspirel - YAMI4

· 이름부터가 재미 있음. peer-to-peer 라는 글자가 보이지만.
성능이 낮은 디바이스(임베디드 계열!)에서도 있는 것이 강점

CLX C++Libraries

CLX C++ Libraries

· 헤더 파일로만 구성된 라이브러리. 일본인이 만든 같음. 여러 가지 가능한 같지만...

?MQ

Code Connected - zeromq

·기존 BSD 소켓과 다르다! 같은 느낌.

무엇을 있는지 알기 어려움.
·zmq 끼리만 통신.
독자적 프레임워크 내의 통신에 사용되고 있는 것을 적이 있다

librascal

Faerion — librascal

러시아산의 탄탄한 크로스 플랫폼 소켓 라이브러리.
안타깝게도 그다지 다 기능이 아니다

EndpointC++ Socket Library

Endpoint

로스 플랫폼 C++ 소켓 라이브러리.
개발 중단 상태.

LiON

LiON - Lundman Wiki

·장점이 보이지만 이것은 C++ 이 아닌 C 이다.
·SSL 간편하게 쓸 수 있는 것은 다행

libwww

Libwww - the W3C Sample Code Library

이것을 잊고 있었다.
· w3c 라이브러리의 Perl LWP에서 유명
· libwww+wxWidgets Amaya

libcurl

curl and libcurl

· C 언어 사용자라면 이것을 추천.
curl
 libwww 대체였던 같다. 사실 libwww 개발은 중단된 상태.

libcurl 사용하자.
· 이것도 큰 라이브러리이다

curlpp

curlpp - cURLpp is a C++ wrapper for libcURL - Google Project Hosting

저의 추천
· CurlC++ 바인딩.
SSL
대응, Proxy 대응, GET, POST, DELETE등 여러 가지에 대응.
·boost 섞어 쓰는 듯.

libsoup

Projects/libsoup - GNOME Wiki!

· GNOME 통신용 라이브러리. 보통 고성능.
· glib 의존한다.
Linux
 한정 한다면 이것으로 좋을지도

neon

neon HTTP and WebDAV client library

·C 언어지만 고성능. 좋은 느낌.
HTTP/WebDAV operations(GET, MOVE, DELETE, etc)
대응
·SSL 대응

 

출처: http://nantonaku-shiawase.hatenablog.com/entry/2013/05/20/231051

 

 

저작자 표시
신고
by 흥배 2014.10.08 08:00

박주항님이 개발한 오픈소스 온라인 게임 서버 프레임워크인 CGSF는 두권의 책 출권 이후에도 꾸준히 개발중입니다.

Github

https://github.com/pdpdds/CGSF


e-book

http://www.hanbit.co.kr/ebook/look.html?isbn=9788968486708

http://www.hanbit.co.kr/ebook/look.html?isbn=9788968486760



현재 개발 현황은 트렐로를 통해서 쉽게 알 수 있습니다.
https://trello.com/b/fQrjvbHp/cgsf



닷넷지원이 추가 되었습니다
https://github.com/pdpdds/CGSF/tree/master/NETFramework


CGSF의 모든 기능을 다 지원하지는 못하고 현재는 네트워크 기능에 중점을 두고 구현 했습니다.
C++ CGSF와 달리 SFPacket 방식만 지원하고 지금은 패킷 옵션은 지원하지 않습니다.
(앞으로 압축과 암호화를 구현할 예정입니다)
이제 막 문서화 작업을 시작해서 아직 문서는 없습니다.^^;
그렇지만 코드가 간단하고, 샘플 프로젝트가 있어서 분석하기 어렵지는 않을 것입니다.
관심 있는 분들의 피드백 부탁합니다.



CGSF와 관련된 질문이나 요청은 
https://github.com/pdpdds/CGSF/issues
를 사용해 주세요^^



ps: 실제 개발에 사용할 분들은 연락주시면 최대한 도와 드리겠습니다( CGSF 관련이 아니라도..)
다만 주항님이나 제가 본업이 있어서 시간적인 한계가 있습니다^^;

저작자 표시
신고
by 흥배 2014.10.02 08:00

CGSF는 박주항님이 만든 온라인 서버 프레임워크로 현재 Github에 공개 되어 있으며 관련 책도 출판 되어 있다.


Github: https://github.com/pdpdds/CGSF

(책) C++로 온라인 게임 서버 구축하기 : CGSF를 활용한 게임 서버 제작 

   http://www.hanbit.co.kr/ebook/look.html?isbn=9788968486708

(책) C++로 온라인 게임 서버 구축하기 : CGSF 파헤쳐 보기 

   http://www.hanbit.co.kr/ebook/look.html?isbn=9788968486760



책 출판 이후에도 CGSF는 꾸준히 개발을 진행 중이다.

개발 진행 상황을 더 쉽게 공유하기 위해 Trello 사용을 시작했다.

https://trello.com/b/fQrjvbHp/cgsf



현재 C++만이 아닌 C#도 지원하기 위해서 닷넷라이브러리를 개발 중이다.

개발 중인 라이브러리와 예제 프로젝트가 올라가 있다.

https://github.com/pdpdds/CGSF/tree/master/NETFramework


예제 프로젝트를 만들면서 닷넷라이브러리 부분도 변경이 조금씩 일어나므로 급하지 않다면 9월 이후에 분석하기 바란다.

(문서화 작업도 할 예정이다)



CGSF와 관련된 질문이나 요구 사항은 Github를 이용하기 바란다.

https://github.com/pdpdds/CGSF/issues

저작자 표시
신고
by 흥배 2014.09.18 08:00

오픈소스 게임서버 라이브러리인 CGSF는 64비트 빌드를 지원한다.

그런데 Visual Studio에서 64비트 플랫폼 선택을 할 수 없는 경우가 있는데 VS의 단추메뉴에서 '솔루션 플랫폼'을 추가하면 된다.




위와 같이 선택하면 64비트로 빌드한다.

저작자 표시
신고
by 흥배 2014.08.27 08:00

Windows에서 TCP/IP용 서버를 만들면 최대 동접을 얼마까지 할 수 있을까?

라는 의문을 가지고 검색을 하면 적지 않게 Windows 레지스터를 바꾸어서 5000으로 늘려야 한다는 글을 볼 수 있습니다.


그런데 이 글들이 대부분이 Windows 2000 이나 2003을 기준으로 적어진 경우가 많습니다. 

그래서 지금의 최신 버전의 Windows와 틀린 부분이 많습니다.


이와 관련해서 정성태님의 블로그에 아주 좋은 글이 있어서 소개합니다.

윈도우 서버 환경에서, 최대 생성 가능한 소켓(socket) 연결 수는 얼마일까?

http://www.sysnet.pe.kr/2/0/964

위 글에서 소개된 아래 글도 보면 좋습니다. 

Configure the max limit for concurrent TCP connections 

http://smallvoid.com/article/winnt-tcpip-max-limit.html



웹에서 Windows와 관련된 글을 볼 때 한글로 된 글인 경우 Windows 2000 이나 2003 때의 이야기를 지금도 그대로 믿고 있거나 오래전에 적어진 글이 꽤 있습니다. 그래서 Windows Vista 이후와는 많이 다른 경우가 꽤 있으니 언제나 잘 확인해 보는 것이 좋습니다.


저작자 표시
신고
by 흥배 2013.06.28 08:00
| 1 2 |