Ask Your Question

Jinuk's profile - activity

2018-11-28 18:53:07 +0900 edited answer flavor 사용시 패키징 문의

안녕하세요. 아이펀팩토리입니다. 위에서 올려주셨던 문제를 수정(C# 환경에서 flavor 를 설정한 deb 패키지를 설치할 수 없는 문제 수정) 을 포함한 1.0.0-3714 experimental 버전이 배포되었습니다. 엔진 업데이트 이후에도 동일한 증상이 발생하는지 확인부탁드립니다.

엔진 업데이트 방법은 쉘 상에서 아래 명령어를 입력해주시면 됩니다.

sudo apt-get update

sudo apt-get install funapi1-dev

위 수정사항을 포함한 변경 내역은 빠른 시일 내에 체인지 로그에 반영될 예정입니다. 불편을 드려 죄송합니다.

2018-11-20 20:52:01 +0900 received badge  Commentator (source)
2018-11-20 20:52:01 +0900 commented answer 패키징 시 MANIFEST 설정 문의

external_ip_resolversnat:... 부분을 쓸 때 IP 주소만 지정한 경우 -- 예를 들어 "external_ip_resolvers": "nat:147.46.123.45" 처럼 지정한 경우 -- 포트는 tcp_protobuf_... 등에서 지정한 값을 외부에 노출된 값으로 인식하고 사용합니다.

2018-11-20 15:52:44 +0900 commented answer 패키징 시 MANIFEST 설정 문의

후자는 NAT 환경에서만 필요한 설정입니다. external_ip_resolvers: aws,nic:eth0,nat:192.0.2.113:tcp+pbuf=8012:http+json=8018 에서 아래와 같은 방법으로 할 수 있습니다.

  • AWS인 경우 aws만 지정
  • nic:eth0 혹은 사용할 외부 인터페이스로 지정. (해당 인터페이스가 public IP를 받는 경우에만 유효)
  • nat:{IP}: {IP} 값으로 실제 public IP 지정.
2018-11-02 15:46:00 +0900 commented answer 서버에서 세션을 닫은 후에도 서버에서 메시지를 전송하는게 가능한지 문의드립니다.
  • SetLoggedOut : 세션을 로그아웃 시킵니다. 해당 서버에 접속한 경우에만 유효합니다.
  • SetLoggedOutGlobal: 세션을 로그아웃 시킵니다. 분산시스템으로 연결한 모든 서버에서 해당 유저를 찾아서 로그아웃합니다.
2018-11-02 12:25:28 +0900 commented answer 서버에서 세션을 닫은 후에도 서버에서 메시지를 전송하는게 가능한지 문의드립니다.

다음을 확인 부탁드립니다:

  • session closed 핸들러 (기본 생성하는 코드의 OnSessionClsoed )에서 SetLoggedOut 혹은 SetLoggedOutAsync 를 호출하는지 여부: 세션이 닫혔는지와 무관하게 (서버 프로세스 안에서는) 메모리 주소만 보기 때문에 위처럼 동작할 수 있습니다.
  • 두 대 이상의 서버를 사용하는데 RpcService 가 활성화되었는지 여부 - 서로 다른 서버의 로그인 정보를 공유하려면 Rpc가 필요합니다.
2018-11-02 12:23:33 +0900 edited answer 서버에서 세션을 닫은 후에도 서버에서 메시지를 전송하는게 가능한지 문의드립니다.

다시 한번 확인해보니 Close 처리는 정상적으로 되었었네요..죄송합니다.

현재 중복 로그인 확인하여 Session을 Close 처리를 하고 있는데요. Session이 Close 처리된 클라이언트가 다시 재 연결되어 통신이 되었던것으로 확인되었습니다. AccountManager::CheckAndSetLoggedInAsync() 통해 중복 로그인을 확인하고 있는데요. 최초 중복 로그인애 대한 처리가 정상적이였나, Session Close 처리된 클라이언트가 다시 재접속하여 로그인이 성공이 되었습니다. 같은 id로 양쪽에서 성공된 현상입니다. 로그 확인 부탁 드리겠습니다.ㅜ

2018-11-02 10:31:52 +0900 received badge  Associate Editor (source)
2018-11-02 10:31:52 +0900 edited question 서버에서 세션을 닫은 후에도 서버에서 메시지를 전송하는게 가능한지 문의드립니다.

서버에서 접속중인 클라이언트의 Session을 Close() 처리하였습니다. 일정 시간후 클라이언트에서는 기존 Session으로 Connect 하여 (당연히 FunapiSession.Create 함수는 호출 하지 않았고요) 서버로 메시지 전송 할경우, 서버는 신규 Session을 Open 하지 않고 tcp 전송 처리가 가능하던데요. Session을 Close 처리하였는데 Session Open을 하지 않고 통신이 되는게 맞는 건가요? 서버의 "close_transport_when_session_close": true 입니다.

I1102 02:30:23.211693  4493 aid_server.cc:93] Starting login server
I1102 02:30:37.098347  4498 transport.cc:380] Client plugin version: 265
I1102 02:30:37.098511  4498 session_impl.cc:2126] [C->S] TCP/Protobuf: type=, length=0, session=00000000-0000-0000-0000-000000000000 
I1102 02:30:37.098881  4498 session_impl.cc:2126] [S->C] TCP/Protobuf: type=_session_opened, length=61, session=3b4fcd0e-7113-43c2-acf2-a6fc1d65f1c1 
I1102 02:30:37.099036  4498 session_service.cc:2146] session created: sid=3b4fcd0e-7113-43c2-acf2-a6fc1d65f1c1, protocol=TCP, encoding=application/octet-stream, address=14.33.100.95:62464
I1102 02:30:37.098937  4529 login_event_handlers.cc:63] OnTransportTcpAttached_id :3b4fcd0e-7113-43c2-acf2-a6fc1d65f1c1
I1102 02:30:37.099241  4529 login_event_handlers.cc:23] OnSessionOpened_session_id :3b4fcd0e-7113-43c2-acf2-a6fc1d65f1c1
I1102 02:30:37.158066  4499 session_impl.cc:2126] [C->S] TCP/Protobuf: type=, length=44, session=3b4fcd0e-7113-43c2-acf2-a6fc1d65f1c1 
I1102 02:30:37.304252  4496 session_impl.cc:2126] [C->S] TCP/Protobuf: type=login, length=110, session=3b4fcd0e-7113-43c2-acf2-a6fc1d65f1c1 [login_req] { id: "TestUser1" device_id: "DFDFSFSDFWEGWEGEGWE" os_type: "windows" maket_type: "Goolge" auth_type: "guest" }
I1102 02:30:37.310436  4529 login_event_handlers.cc:153] Session_id=3b4fcd0e-7113-43c2-acf2-a6fc1d65f1c1
I1102 02:30:37.317389  4529 login_event_handlers.cc:153] Session_id=3b4fcd0e-7113-43c2-acf2-a6fc1d65f1c1
I1102 02:30:37.317646  4529 login_event_handlers.cc:252] client_ip_address=14.33.100.95
I1102 02:30:37.317728  4529 login_event_handlers.cc:262] Succeed to login: id=TestUser1
I1102 02:30:37.317975  4529 session_impl.cc:2126] [S->C] TCP/Protobuf: type=login, length=70, session=3b4fcd0e-7113-43c2-acf2-a6fc1d65f1c1 [login_repl] { result: OK host_name: "52.231.68.36" }
I1102 02:30:37.364382  4499 session_impl.cc:2126] [C->S] TCP/Protobuf: type=, length=44, session=3b4fcd0e-7113-43c2-acf2-a6fc1d65f1c1 
I1102 02:30:39.527246  4499 transport.cc:380] Client plugin version: 265
I1102 02:30:39.527283  4499 session_impl.cc:2126] [C->S] TCP/Protobuf: type=, length=0, session=00000000-0000-0000-0000-000000000000 
I1102 02:30:39.527357  4499 session_impl.cc:2126] [S->C] TCP/Protobuf: type=_session_opened, length=61, session=60bcb24e-c198-4dd5-a91d-6748a155f5e8 
I1102 02:30:39.527390  4499 session_service.cc:2146] session created: sid=60bcb24e-c198-4dd5-a91d-6748a155f5e8, protocol=TCP, encoding=application/octet-stream, address=14.33.100.95:62466
I1102 02:30:39.527484  4529 login_event_handlers.cc:63] OnTransportTcpAttached_id :60bcb24e-c198-4dd5-a91d-6748a155f5e8
I1102 02:30:39.527523  4529 login_event_handlers.cc:23] OnSessionOpened_session_id :60bcb24e-c198-4dd5-a91d-6748a155f5e8
I1102 02:30:39.622436  4499 session_impl.cc:2126] [C->S] TCP/Protobuf: type=, length=44, session=60bcb24e-c198-4dd5-a91d-6748a155f5e8 
I1102 02:30:39.760064  4497 session_impl.cc:2126] [C->S] TCP/Protobuf: type=login, length=110, session=60bcb24e-c198-4dd5-a91d-6748a155f5e8 [login_req] { id: "TestUser1" device_id: "DFDFSFSDFWEGWEGEGWE" os_type: "windows" maket_type: "Goolge" auth_type: "guest" }
I1102 02:30:39.760596  4529 login_event_handlers.cc:107] OnLoggedIn_Failed_id=TestUser1
I1102 02:30:39.760710  4529 session_impl.cc:2126] [S->C] TCP/Protobuf: type=login, length=56, session=60bcb24e-c198-4dd5-a91d-6748a155f5e8 [login_repl] { result: OVERLAP }
I1102 02:30:39.765719  4529 login_event_handlers.cc:126] Logged_out(local) by duplicated login request: id=TestUser1
I1102 02:30:39.765884  4529 session_impl.cc:2126] [S->C] TCP/Protobuf: type=_session_closed, length=55, session ...
(more)
2018-11-01 17:48:36 +0900 answered a question 세션 관련 해서 문의 드립니다.

아래와 같은 상황으로 보이는데 맞는지요?

  1. (서버) Session::Close() 호출
  2. (클라이언트) FunapiSession::SendMessage() 호출

2에 대해서도 session closed 콜백이 호출되기 전까지는 보낼 수 있고, 전송에도 성공할 수 있습니다. (따라서 서버에도 도착할 수 있습니다) 이 경우에 이미 닫힌 세션이라 서버에서는 해당 메시지를 무시하게 됩니다.

이와 다른 상황이라면 추가 설명 부탁드립니다.

2018-11-01 17:17:39 +0900 commented answer FunapiSession 문의 드립니다.

https://ifunfactory.com/engine/docume... 에 해당합니다. TCP/UDP 에서 사용 가능하며, 세션 아이디를 한 번만 보내게 하는 기능입니다.

2018-11-01 16:02:30 +0900 commented answer funengine에서 http를 어떤 웹엔진을 사용하고 있나요?

우선 ApiService 는 클라이언트 연결을 받기 위한 기능은 아니고, 외부 서비스에서 요청을 받는 용도입니다. (예를 들어 CS 요청 처리, 외부 결제 서비스의 callback 받기, 기획 데이터 업데이트 등등)

  1. KeepAlive 는 헤더를 지정해서 보내면 됩니다. (아이펀 엔진에서 먼저 끊지는 않습니다)
  2. Connection count 는 무슨 의미인지 잘 모르겠으나, 문자 그대로 설명드리면, 연결 시도한 만큼 / OS에서 허용하는 만큼 연결을 받습니다.

이 이후 내용은 별도 질문으로 부탁드립니다.

2018-11-01 11:21:13 +0900 answered a question undefined symbol 문제

구현이 포함되지 않은 심볼은 다음과 같은 방법으로 확인하실 수 있습니다.

$ c++filt
_ZN4test4Room8kNullPtrE
test::Room::kNullPtr

c++filt 란 명령을 실행 후, 없다고 나오는 심볼 정보를 입력하면 해당 심볼의 C++ 쪽 이름을 확인할 수 있습니다. (위에 붙여주신 로그에서는 임의로 원래 3글자인 서버 이름을 test로 치환한 것으로 보입니다. 원본 이름을 c++filt 에 넣으면 확인 할 수 있습니다.)

2018-11-01 11:07:22 +0900 answered a question undefined symbol 문제

Failed to open libtest.so 란 의미는, libtest.so 안에 _선언은 했으나_ 정의하지 않은 함수/변수 가 있다는 의미입니다. 에러 메시지 뒷쪽이 좀 잘려서 정확한 함수/변수 이름은 알 수 없으나, test::Room::NullPtr 라는 변수 혹은 함수가 정의되지 않은 것으로 보입니다.

아이펀 엔진 내에서 발생하는 문제는 아닌 것으로 보이고, test 라는 서버 내에 해당 변수/함수를 정의하면 해결됩니다.

2018-11-01 10:42:24 +0900 edited question undefined symbol 문제

빌드는 이상 없는데 실행하면 아래와 같이 종료가 됩니다. libtest.so 파일은 있는걸로 확인 되는데요. 뭐가 문제 일까요?

[INFO] test_server@login is starting.
I1101 01:03:25.705612 29124 main.cc:595] Engine version: 1.0.0-3624xenial
I1101 01:03:25.705945 29124 main.cc:601] Command line arguments: [test_server.login]
I1101 01:03:25.706048 29124 main.cc:602] Server flavor: login
I1101 01:03:25.706161 29124 main.cc:616] Crashreporter initialized; .dmp will be written to /home/good/projects/test-Server/test-build/debug/dumps
I1101 01:03:26.143991 29124 main.cc:638] License info: {"production":true,"expires":"2019-Sep-14 23:59:59"}
I1101 01:03:26.151038 29124 manifest_handler.cc:666] libfunapi_mongodblogger.so loaded.
I1101 01:03:26.152526 29124 manifest_handler.cc:666] libtest.so not loaded.

Broadcast message from systemd-journald@login (Thu 2018-11-01 01:03:26 UTC):

test_server.login[29124]: Assert failed: handle: testServer: failed to open libtest.so: /home/good/projects/test-Server/test-build/debug/src/libtest.so: undefined symbol: _ZN3test4Room8kNullPtrE

F1101 01:03:26.152704 29124 manifest_handler.cc:669] Assert failed: handle: testServer: failed to open libtest.so: /home/good/projects/test-Server/test-build/debug/src/libtest.so: undefined symbol: _ZN3test4Room8kNullPtrE
*** Check failure stack trace: ***
    @     0x7f8f6253f5cd  google::LogMessage::Fail()
    @     0x7f8f62541433  google::LogMessage::SendToLog()
    @     0x7f8f6253f15b  google::LogMessage::Flush()
    @     0x7f8f6253f379  google::LogMessage::~LogMessage()
    @           0x9c1343  fun::LoadComponentsLibraries()
    @           0x74ed55  main
    @     0x7f8f6028f830  __libc_start_main
    @           0x777be9  _start
    @              (nil)  (unknown)
/usr/share/funapi/bash/launcher-common.sh: line 154: 29124 Aborted                 (core dumped) $fork_prefix $FUNAPI_BIN_DIR/funapi_runner $args $@
[ERROR] test_server@login termianted with 134.
good@login:~/projects/test-Server/test-build/debug$
2018-10-31 18:06:43 +0900 answered a question tcp chatting test

테스트 방법에 대한 상세한 내용없이 답변할 수 없는 내용 입니다.

2018-10-31 18:02:46 +0900 answered a question funengine에서 http를 어떤 웹엔진을 사용하고 있나요?

HTTP 서버에 대한 얘기라면, 아이펀 엔진은 직접 HTTP를 처리합니다. 별도의 웹 엔진은 없습니다.

2018-10-31 18:02:10 +0900 answered a question RPC 통신 HOOK 문의

RpcMessage 에 대해서 공통 메시지를 만들고, 해당 메시지에 대해서 이벤트 태그를 지정하시는 방법을 쓰는게 나을 것 같습니다.

훅을 추가하는 방식은 현재 고려하고 있지 않습니다.

2018-10-25 12:23:14 +0900 answered a question 서버 구성 관련 문의 드립니다.

이동할 대상은 구분 가능해야 합니다. RedirectClient 로 이동할 목적지 서버 (클라이언트가 새로 접속할 서버) 의 IP가 직접 노출되어 있어야 합니다. 혹은, 해당 서버가 DNS 주소를 가지고 있고, 목적지 서버만 해당 DNS 주소를 사용하고 있어야합니다.

다만, 로비서버 류처럼 로비 서버 중 한 대에 접속할 수 있으면 충분한 경우 MANIFEST.json 설정을 수정하면 앞에 L4 로드밸런서를 둘 수 있습니다. https://www.ifunfactory.com/engine/do... 에서 redirection_strict_check_server_id 값을 false 로 설정하면 해당 방식으로 동작합니다.)

반면에, 특정 게임 서버에 꼭 접속해야하는 경우엔 사용할 수 없습니다. 이 경우 게임 서버마다 서로 다른 주소 (IP:port 혹은 DNS주소:port 쌍) 를 외부에 노출해야 합니다.

2018-10-18 17:48:59 +0900 commented answer col__Object_id 질문입니다.

ORM 객체가 User 라는 클래스라고 치면, 아래와 같이 col__ObjectId_ 값을 문자열 형식으로 얻을 수 있습니다.

  Ptr<User> user = User::FetchBySomeKey(...);
  DLOG(INFO) << "Primary key: " << boost::lexical_cast<std::string>(user->Id());
2018-10-15 10:33:19 +0900 answered a question ORM 속성 타입 문의드립니다.

TIMESTAMP 대신 integer 로 저장하시면 됩니다.

해당 데이터를 게임 서버에서 사용하실 때,

  • 값 -> 시간: fun::WallClock::FromTimestampInSec()
  • 시간 -> 값: fun::WallClock::ToTimestampInSec()

두 함수를 써서 변환해서 사용하시면 됩니다.

더불어 MySQL 내에서는 SELECT FROM_TIMESTAMP(col_timestamp_field) ... 처럼 사용하시면 됩니다.

2018-09-11 10:39:49 +0900 edited question [서포터즈] 패키징 후 배포한뒤 연결 실패 현상

안녕하세요!

비쥬얼 스튜디오로 ORM을 이용하여 데이터를 넣고 확인하는거까지 테스트 완료했습니다.

유니티 테스트 클라이언트에서 TCP로 데이터를 날리면 서버에서 받아서 처리하고 응답메세지까지 정상적으로 오는데요

우분트 테스트서버에 소스폴더에서 cmake 한뒤 make clean 다시 make pacakage 를 하고 dpkg 설치까지 했습니다.

처음엔 제가 설정을 잘못해서 서비스 등록및 실행이 안되서 dpkg 를 제거 후 다시 재설치를 여러번했는데요

결국엔 서비스 등록 및 서비스 실행까지 정상적으로 구동되었습니다.

클라이언트에서 다시 테스트를 시도하니

Broadcast message from systemd-journald@ubuntu (Sun 2018-08-05 19:32:35 UTC):

i_fun_engine_example_server.default[4693]: Assert failed: outputFile:

콘솔창에 이러한 실패 메세지가 뜨고 클라이언트 로그에도 접속 실패가 뜨네요

혹시나 해서 /etc/default/ 경로로 가서 런처에 로그출력 옵션을 더해서 직접 실행해봤습니다.

이부분부터가 오류가 발생하는 부분인데요

E0805 19:42:24.154207  5122 socket.cc:635] failed to bind listen address: Address already in use. error_code=system:98, listen_address=0.0.0.0:8014
F0805 19:42:24.154505  5122 manifest_handler.cc:748] Assert failed: started: Failed to start 'ApiService'

Broadcast message from systemd-journald@ubuntu (Sun 2018-08-05 19:42:24 UTC):

i_fun_engine_example_server.default[5122]: Assert failed: started: Failed to start 'ApiService'

*** Check failure stack trace: ***
E0805 19:42:24.154862  5122 framework.cc:54] System has been crashed. (1.0.0-2619xenial)
E0805 19:42:24.154876  5122 framework.cc:64] Shutdown AccountManager.
E0805 19:42:24.154886  5122 framework.cc:64] Shutdown EventDispatcher.
E0805 19:42:24.255102  5122 framework.cc:64] Shutdown ObjectTransaction.
E0805 19:42:24.255223  5122 framework.cc:64] Shutdown ObjectDatabase.
I0805 19:42:24.255237  5122 object_database.cc:3599] Flushing 0 update queries
/usr/share/funapi/bash/launcher-common.sh: line 89:  5122 Aborted                 (core dumped) $fork_prefix $FUNAPI_BIN_DIR/funapi_runner $args $@
[ERROR] i_fun_engine_example_server@ubuntu termianted with 134.

Analyzing crashdump /var/crash/funapi/i_fun_engine_example/5ac30717-cf48-4f48-57e69c4c-33ca57dd.dmp

OS Linux 0.0.0 Linux 4.4.0-130-generic #156-Ubuntu SMP Thu Jun 14 08:53:28 UTC 2018 x86_64
CPU amd64 family 23 model 17 stepping 0 2
Crash SIGSEGV 0x7f457b5afe00 0

0 libglog.so.0.0.0 (+0xb5f1)
1 libglog.so.0.0.0 (+0x21e420)
2 libglog.so.0.0.0 (+0x21e480)
3 libglog.so.0.0.0 (+0xd433)
4 libglog.so.0.0.0 (+0x21e440)
5 funapi_runner: _fini (+0x4a6bc)
6 funapi_runner: _fini (+0x4a6db)
7 libc-2.23.so (+0x100be2)
8 libglog.so.0.0.0 (+0x18fbf)
9 libglog.so.0.0.0 (+0xb15b)
10 libglog.so.0.0.0 (+0xb379)
11 funapi_runner: fun::StartComponents() (+0x43b)
12 funapi_runner: _init (+0x1600)
13  (+0x7f456850d2c0)
14 funapi_runner: HandleProtobufLogMessage(google::protobuf::LogLevel, char const*, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (+0xb00)
15 funapi_runner: main (+0xef1)

Run "/usr/bin/funapi_stackwalk '/var/crash/funapi/i_fun_engine_example/5ac30717-cf48-4f48-57e69c4c-33ca57dd.dmp' /usr/share/i_fun_engine_example/default/symbols /usr/share/funapi/symbols" to display crash-info

이 오류가 발생해서 접속이 안되는것이 맞나요??

혹 제가 빠트린 셋팅이 있거나 IDE 상에서 디버그 할때와는 다르게 릴리즈할때는 뭔가 다른 셋팅이 있는건지.. 궁금하네요

참고로 우분투버전은 16버전이구요 유투브에 올려주신 튜토리얼에 리눅스 셋팅 참고해서 설치했습니다.

더 필요한 정보가 있으면 알려주시면 덧글에 올리겠습니다.

감사합니다!

2018-09-11 10:33:20 +0900 answered a question RegisterZoneHandler 사용에 관한 질문

RegisterZoneHandler 로 등록한 콜백함수는 선언한 Zone 에 진입하거나, 나가는 경우 한 번 씩 호출됩니다.

생성한 Zone 을 들어가거나 나가는 상황이 맞는지 확인 부탁드리빈다. (하나의 Zone 내에서 이동하면 호출하지 않습니다)

2018-09-11 10:02:48 +0900 edited question RegisterZoneHandler 사용에 관한 질문

안녕하세요. iFun engine으로 월드맵을 만들어보면서 테스트해보고 있습니다.

현재 WorldManager 에 하나의 월드와 4개의 존을 추가해 놨습니다. WorldManager 에서 RegisterZoneHandler 를 사용해 존을 출입할 때 통보 받을 수 있다고 해서 간단한 콜백함수(단순 로그만 출력)를 하나 만들어서 등록해놓고 테스트를 해봤는데요. 처음엔 월드맵에서 캐릭터를 이동시키면 좌표에 따라 이벤트가 발생해서 콜백함수가 수행되고 로그가 출력되는 걸 확인했습니다만 어느 순간부터 월드에서 캐릭을 이동시켜도 콜백함수가 호출되지 않고 있습니다. 이럴 경우 어떤 부분을 확인해봐야 할까요?

월드와 존 셋팅, 함수 등록 등등 가이드 문서를 참고해서 작업을 했습니다. 예제나 설명이 너무 간단하게만 적혀있어서 좀 불편합니다. 이 부분에 대한 업데이트도 부탁드리겠습니다.

2018-09-11 09:59:18 +0900 asked a question Sanity check

Sanity check posting.

2018-09-03 14:53:27 +0900 commented answer 서버가 가끔 crash나는 현상이 발생합니다.

버그가 게임 서버와 MySQL 서버 사이의 연결 종료 후에 생기는 것으로 보이며, 이 부분을 완화하기 위해서 아래설정을 수정 부탁드립니다.

문제 파악 후에 패치를 진행할 예정입니다

2018-09-03 13:34:26 +0900 edited answer 서버가 가끔 crash나는 현상이 발생합니다.

안녕하세요 일단 이곳에 올리겠습니다.

E0902 18:14:52.081010 102191 curl.cc:166] curl_easy_perform() failed: 56
E0902 18:14:52.085912 102191 google_plus_authentication.cc:80] Failed to authenticate google plus. http request failure. error code=56, error desc=Failure when receiving data from the peer
E0902 18:14:52.086588 102191 (Mono)Server.HandleLogin.cs:188] Failed to verify the authentication.
E0902 18:18:30.049185 102188 curl.cc:166] curl_easy_perform() failed: 56
E0902 18:18:30.049405 102188 google_plus_authentication.cc:80] Failed to authenticate google plus. http request failure. error code=56, error desc=Failure when receiving data from the peer
E0902 18:18:30.051548 102188 (Mono)Server.HandleLogin.cs:188] Failed to verify the authentication.
E0902 18:36:15.820564 102188 curl.cc:166] curl_easy_perform() failed: 56
E0902 18:36:15.826800 102188 google_plus_authentication.cc:80] Failed to authenticate google plus. http request failure. error code=56, error desc=Failure when receiving data from the peer
E0902 18:36:15.827343 102188 (Mono)Server.HandleLogin.cs:188] Failed to verify the authentication.
E0902 18:53:11.262465 102188 curl.cc:166] curl_easy_perform() failed: 56
E0902 18:53:11.262734 102188 google_plus_authentication.cc:80] Failed to authenticate google plus. http request failure. error code=56, error desc=Failure when receiving data from the peer
E0902 18:53:11.263173 102188 (Mono)Server.HandleLogin.cs:188] Failed to verify the authentication.
E0902 19:07:50.617856 102190 curl.cc:166] curl_easy_perform() failed: 56
E0902 19:07:50.618100 102190 google_plus_authentication.cc:80] Failed to authenticate google plus. http request failure. error code=56, error desc=Failure when receiving data from the peer
E0902 19:07:50.618578 102190 (Mono)Server.HandleLogin.cs:188] Failed to verify the authentication.
E0902 19:07:53.326472 102191 (Mono)Server.HandlePvPMyInfo.cs:117] System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
  at System.Collections.Generic.Dictionary`2[funapi.Session,System.String].get_Item (funapi.Session key) [0x00000] in <filename unknown>:0 
  at InfiniteSlayers.Server.OnPvPMyInfo (funapi.Session session, Newtonsoft.Json.Linq.JObject message) [0x00008] in /home/casper7609/xxxx-source/mono/Server/PvP/Server.HandlePvPMyInfo.cs:17 
E0902 19:07:53.366467 102189 (Mono)Server.HandlePvPMyInfo.cs:117] System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
  at System.Collections.Generic.Dictionary`2[funapi.Session,System.String].get_Item (funapi.Session key) [0x00000] in <filename unknown>:0 
  at InfiniteSlayers.Server.OnPvPMyInfo (funapi.Session session, Newtonsoft.Json.Linq.JObject message) [0x00008] in /home/casper7609/xxxx-source/mono/Server/PvP/Server.HandlePvPMyInfo.cs:17 
E0902 19:07:53.366804 102189 (Mono)Server.HandlePvPHistory.cs:108] System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
  at System.Collections.Generic.Dictionary`2[funapi.Session,System.String].get_Item (funapi.Session key) [0x00000] in <filename unknown>:0 
  at InfiniteSlayers.Server.OnPvPHistory (funapi.Session session, Newtonsoft.Json.Linq.JObject message) [0x00008] in /home/casper7609/xxxx-source/mono/Server/PvP/Server.HandlePvPHistory.cs:17 
E0902 20:02:40.737157 102190 curl.cc:166] curl_easy_perform ...
(more)
2018-09-03 09:37:39 +0900 commented answer 서버가 가끔 crash나는 현상이 발생합니다.

로그를 추가 댓글로 붙여주시거나, funapi-support@ifunfactory.com 으로 보내주세요. 후자로 보내주시면 저희가 관련있는 내용만 포함해서 여기에 댓글로 다시 올릴 예정입니다.

2018-06-12 15:21:53 +0900 answered a question Test 용 matchmaker 서버 오류 종료 문의

pong.lobby 와 pong.matchmaker 가 서로 다른 버전의 아이펀엔진을 사용해서 빌드한 것으로 보입니다. 두 서버를 같은 곳에서 빌드했는지 (같은 서버의 같은 빌드 디렉터리) 여부를 확인해주세요. 같은 디렉터리가 아니라면 make clean 후 다시 빌드 부탁 드립니다.

(오류 로그의 Unknown RPC message ... 부분이 한쪽 서버가 이해하지 못하는 메시지를 받았다는 의미인데, 양쪽 서버의 버전이 다를 때만 발생할 수 있습니다 (RPC를 사용한다면 같은 서버 군에서 빌드 / 실행 시간 버전이 모두 호환되는 버전이어야 합니다.)

2018-06-12 15:16:20 +0900 edited question Test 용 matchmaker 서버 오류 종료 문의

안녕하세요 ifunengine 을 검토 중에 matchmaker 서버 오류가 발생하여 문의를 드립니다.

테스트 환경 ( windows10, virtualbox, ubuntu 14.04 LTS ) 을 구성하였고,

테스트 서버 소스 ( https://github.com/iFunFactory/game-p... ) 를 내려 받아서 빌드까지 완료 하였습니다.

이후 funapi-authenticator-launcher 실행 funapi-leaderboard-launcher 실행 후

pong.lobby-local 실행 pong.matchmaker-local 실행 직후 아래와 같은 오류가 발생하면 서버가 죽습니다.

이런 경우 어떻게 해결을 해야 하는지요? 확인 부탁 드립니다.

감사합니다.

--- 아래 ---
I0612 09:36:29.596633  4162 pong_server.cc:47] Starting matchmaker server
I0612 09:36:29.601740  4174 rpc_service.cc:711] RPC server handshaking completed: peer=08002724-0f62-7f17-0000-000000000000(P)(10.0.2.15:6015), Total RPC peers=2
F0612 09:36:29.601932  4174 rpc_service.cc:769] Unknown RPC message: type=FODSFingerprintCheck
*** Check failure stack trace: ***
E0612 09:36:29.602370  4174 framework.cc:54] System has been crashed. (1.0.0-2619trusty)
E0612 09:36:29.602380  4174 framework.cc:64] Shutdown EventDispatcher.
E0612 09:36:29.702494  4174 framework.cc:64] Shutdown ObjectLeaser.
E0612 09:36:29.702527  4174 framework.cc:64] Shutdown ObjectTransaction.
E0612 09:36:29.702563  4174 framework.cc:64] Shutdown ZookeeperClient.
I0612 09:36:30.702806  4174 zookeeper_client.cc:141] Finalizing zookeeper client. Disconnecting the zookeeper session. session_id=0x163f16977a10004, state=CONNECTED_STATE
I0612 09:36:30.702927  4174 zookeeper_client.cc:162] The zookeeper session disconnected. session_id=0x163f16977a10004, state=CLOSED_STATE
I0612 09:36:30.702965  4174 zookeeper_client.cc:141] Finalizing zookeeper client. Disconnecting the zookeeper session. session_id=0x163f16977a10005, state=CONNECTED_STATE
I0612 09:36:30.703085  4174 zookeeper_client.cc:162] The zookeeper session disconnected. session_id=0x163f16977a10005, state=CLOSED_STATE
I0612 09:36:30.703126  4174 zookeeper_client.cc:141] Finalizing zookeeper client. Disconnecting the zookeeper session. session_id=0x163f16977a10006, state=CONNECTED_STATE
I0612 09:36:30.703183  4174 zookeeper_client.cc:162] The zookeeper session disconnected. session_id=0x163f16977a10006, state=CLOSED_STATE
I0612 09:36:30.703207  4174 zookeeper_client.cc:141] Finalizing zookeeper client. Disconnecting the zookeeper session. session_id=0x163f16977a10007, state=CONNECTED_STATE
I0612 09:36:30.703296  4174 zookeeper_client.cc:162] The zookeeper session disconnected. session_id=0x163f16977a10007, state=CLOSED_STATE
E0612 09:36:30.728139  4174 main.cc:193] Crashdump written to /home/jacob/work/game-pong-server/pong-build/debug/dumps/53b886ae-a0dd-44ec-3d8cf7b8-60660773.dmp
/usr/share/funapi/bash/launcher-common.sh: line 89:  4162 세그멘테이션 오류 (core dumped) $fork_prefix $FUNAPI_BIN_DIR/funapi_runner $args $@
[ERROR] pong_server@jacob-VirtualBox termianted with 139.

Analyzing crashdump /home/jacob/work/game-pong-server/pong-build/debug/dumps/53b886ae-a0dd-44ec-3d8cf7b8-60660773.dmp
2018-05-18 10:48:22 +0900 commented answer Missing ApiService finisher 로그 질문드립니다.

분산서버인 경우에 자동으로 클라이언트를 이동시켜주진 않습니다.

  • 서버의 부하 상황을 알 수 있는 값을 만드시고
  • 해당 값에 따라서 AccountManager::RedirectClient 로 다른 서버로 옮기기

를 쓰시는게 좋아보입니다.

2018-05-18 09:31:48 +0900 answered a question Missing ApiService finisher 로그 질문드립니다.

4

Session::IsTransportAttached() 혹은 Session::IsTransportAttached(transport_type) 함수를 이용해서 연결이 하나라도 되어있는지, 혹은 특정 타입의 연결이 있는지 확인할 수 있습니다.

2018-05-18 09:30:31 +0900 answered a question Missing ApiService finisher 로그 질문드립니다.

3

  • Flavor 가 동일한 서버가 여러대 존재하는 것에는 문제가 없습니다. 분산처리가 된다라고 말씀하시는게 생각할 수 있는 범위가 많은데, 아이펀엔진에서 보장하거나 제공하는 것은 아래와 같습니다. (기능이 많아서 간단한 것만 적었습니다. 자세한 사항은 레퍼런스 매뉴얼을 참고해주세요)

  • AccountManager 를 통한 분산 서버군 전체의 로그인 상태 관리

  • ORM을 사용한 경우, 한 번에 한 이벤트에서만 특정 디비 객체에 접근할 수 있게 제어
  • 서로 다른 서버에 있는 유저에게 메시지 전송
  • 아이펀엔진에서 제공하는 각종 서비스 (매치 메이킹, 빌링, 리더보드, dedicated server 관리, ...) 지원

만약 특정 서버에서 변경한 메모리 상태를 바로 다른 서버에서 보길 원한다면 해당하는 방식의 동기화는 지원하지 않으며, 클라이언트 이동 기능으로 특정 서버로 보내거나, RPC메시지를 통해서 동기화해야 합니다.

2018-05-18 09:26:49 +0900 answered a question Missing ApiService finisher 로그 질문드립니다.

2 해당 로그는 데이터베이스 연결이 DB 쪽 타임아웃 후에 다시 연결할 때 나오는 메시지입니다. 해당 변수와 관련이 있으며, 나온다고 해도 크게 문제되진 않습니다. (짧은 시간 안에 지속적으로 연결에 실패하는 경우에는 데이터베이스 서버가 떠 있는지 확인해주세요)

2018-05-18 09:25:46 +0900 answered a question Missing ApiService finisher 로그 질문드립니다.
  1. W0518 08:43:05.342229 10327 api_service.cc:159] Missing ApiService finisher: "GET /users/ 는 해당 HTTP API 호출에 대해서 응답을 보내지 않으면 (보낼 때까지 혹은 연결이 끊길 때까지) 지속적으로 로그가 출력됩니다. 해당 URL로 들어온 요청을 처리하는 함수가 HTTP 응답을 보내지 않는 경우가 있는지 확인해주세요.
2018-05-08 11:55:19 +0900 edited answer C# 프로젝트 빌드 중 오류 질문드립니다.

{ "CreatedUserCount": { "ServerName": "String(20) Key",// "CreatedCount": "Integer" }, "GooglePlusAccount": { "ClientId": "String(24) Key", "Email": "String(74)", "DisplayName": "String(64)", "User": "User Foreign" }, "UserName": { "UserName": "String(20) Key", "User": "User Foreign" }, "User": { "HashId": "String(16) KEY", "UserName": "String(20)",//사용자 이름 "HasChangedUserName": "Boolean", "AuthType": "Integer",//EAuthType "IsAdmin": "Boolean", //Admin 이면 게임에 아무런 영향도 주지 않는다 ex.) 랭킹이나 그런데 포함 안됨, PvP MatchMaking에 포함 안됨 등등 "IsBanned": "Boolean",//차단된 사용자 "BannedTimeFrom": "Integer", "BannedTimeTo": "Integer", "BannedReason": "String(256)", "UserLevel": "Integer",//사용자 레벨 "Gold": "Double",//골드, 캐릭터 가짜 레벨업에 사용 "Gem": "Integer",//젬 "GemAccum": "Integer",//gem received, except for purchase "CharacterPoint": "Integer",//캐릭터 진짜 레벨업, 스킬 업에 사용 "ItemPoint": "Integer",//아이템 레벨업에 사용 "DungeonKey": "Integer",//던전 입장에 사용 "DungeonKeyRechargeTime": "Integer", "PvPEnabled": "Boolean",//Can Play PvP? 500 stage clear is required "PvPPoint": "Integer",//PvP 입장에 사용 "PvPPointRechargeTime": "Integer", "BonusBoxRechargeTime": "Integer", "AdGoldTimeLeft": "Integer",//Gold rewarded Ad time left, 단위: 초 "DoubleSpeedTimeLeft": "Integer",//2배 속도 남은 시간, 단위: 초 "TripleSpeedTimeLeft": "Integer",//3배 속도 남은 시간, 단위: 초 "CreationDate": "Integer",//생성 날짜 "LastLoginTime": "Integer",//마지막 로그인 시각 "LastAliveTime": "Integer",//Used For OfflineStage and to show the most recent active time "LastResetStageTime": "Integer",//

    "PossibleOfflineStage": "Integer",//최대 오프라인 시 도달 스테이지
    "CurrentStage": "Integer",
    "MaxStage": "Integer",
    "ReturnCount": "Integer",//귀환 횟수

    "AdWatchCount": "Integer",//how many times user has watched ad?
    "Payment": "Double",//how much this user paid us in currency


    "BonusBoxEnabled": "Boolean",//Can Open BonusBox? 150 stage clear is required
    "BerserkEnabled": "Boolean",//Can Use Berserk? 30 stage clear is required
    "ItemForgeEnabled": "Boolean",//Can Use Use Item Forge? 250 stage clear is required
    "HasReferredUser": "Boolean",//HasReferredUser


    "HurdleStage": "Integer",
    "PvPCount": "Integer",
    "PvPReward": "PvPReward Foreign",

    "DailyQuestResetTime": "Integer",
    "WeeklyQuestResetTime": "Integer",

    "RewardsPerHundred": "Integer[]",
    "BanHistories": "BanHistory[] Foreign",
    "SystemMails": "SystemMail[] Foreign",
    "CharacterDatas": "CharacterData[] Foreign",
    "PetInstances": "ItemInstance[] Foreign",
    "Investments": "Investment[] Foreign",
    "Quests": "Quest[] Foreign",
    "PvPResults": "PvPResult[] Foreign",
    "PvPWinRatio": "PvPWinRatio Foreign",
    "GooglePlusAccount": "GooglePlusAccount Foreign"
  },
  "BanHistory": {
     "User": "User Foreign",
     "IsBanned": "Boolean",
     "BannedTimeFrom": "Integer",
     "BannedTimeTo": "Integer",
     "BannedReason": "String(256)"
  },
  "Coupon": {
     "RewardKey": "String(20) KEY",
     "User": "User Foreign",
     "ReceivedTime": "Integer"
  },
  "SystemMail": {
     "User": "User Foreign",
     "Title": "String(128)",
     "TitleTemplate": "Integer",
     "Sender": "String(128)",
     "Message": "String(1024)",
     "MessageTemplate": "Integer",
     "SystemRewards": "SystemReward[] Foreign",
     "CreatedTime": "Integer",
     "ReceivedTime": "Integer",
     "DeletedTime": "Integer",
     "HasReceived": "Bool"
  },
  "SystemReward": {
     "SystemMail": "SystemMail Foreign",
     "RewardType": "Integer",
     "Count": "Integer"
  },
  "Investment": {
     "User": "User Foreign",
     "InvestmentId": "Integer",
     "CurrentCount": "Integer",
     "Level": "Integer"
  },
  "Quest": {
     "User": "User Foreign",
     "QuestType": "Integer",
     "CurrentCount": "Integer",
     "HasReceivedReward": "Bool"
  },
  "ItemInstance": {
     "User": "User Foreign",
     "CharacterData": "CharacterData Foreign",
     "ItemId": "Integer",//EItemId
     "ItemType": "Integer",//EItemType
     "Proficiency": "Integer",
     "CharacterType": "Integer",//ECharacterType. When it's None it doesn't belong to character, it belongs to user. Maybe implemented sometime later.
     "Level": "Integer",
     "IsUnlocked": "Bool",
     "IsEquipped": "Bool",
     "RemainingUses": "Integer"
  },
  "CharacterSkillLevel": {
     "CharacterData": "CharacterData Foreign",
     "CharacterType": "Integer",//ECharacterType
     "SkillId": "Integer",//ESkillIdType
     "Level": "Integer",
     "IsPassive": "Bool"
  },
  "CharacterData": {//Actual Character User Owns
     "User": "User Foreign",
     "CharacterType": "Integer",//ECharacterType
     "GoldLevel": "Integer",
     "RealLevel": "Integer",
     "ActiveType": "Integer",
     "PvPActiveType": "Integer",
     "IsUnlocked": "Bool",
     "CharacterSkillLevels": "CharacterSkillLevel[] Foreign",
     "ItemInstances": "ItemInstance[] Foreign"
  },
  "PvPResult": {
     "User": "User Foreign",
     "Time": "Integer",
     "ResultFromAttacker": "Integer",
     "AttackerUserId": "String(36)",
     "AttackerScore": "Double",
     "AttackerScoreDiff": "Double",
     "AttackerEloDiff": "Double",
     "DefenderUserId": "String(36)",
     "DefenderScore": "Double",
     "DefenderScoreDiff": "Double",
     "DefenderEloDiff": "Double"
  },
  "PvPWinRatio": {
     "User": "User Foreign",
     "Win": "Integer",
     "Lose": "Integer",
     "Draw": "Integer"
  },
  "PvPReward": {
     "User": "User Foreign",
     "PreviousScore": "Integer",
     "PreviousRank": "Integer ...
(more)
2018-05-08 11:54:42 +0900 edited question C# 프로젝트 빌드 중 오류 질문드립니다.

안녕하세요. 배포용 패키지를 만들려고 빌드하는 도중 오류가 나서 질문드립니다.

오류 내용은 다음과 같습니다.

root@ubuntu:/home/test/test_proj-build/debug# make
Not using ccache.
No flavor was given. Adding a default flavor
-- Configuring done
-- Generating done
-- Build files have been written to: /home/test/test_proj-build/debug
[  2%] Extracting a build number from the source tree.
-- Found Git: /usr/bin/git (found version "1.9.1") 
Build number from is 8a460ea~dirty
[  2%] Built target extract_buildno
[  7%] Built target internal_create_launchers
[  9%] Built target internal_import_manifest_dirs
[ 16%] Built target internal_import_resource_dirs
[ 19%] Generating /home/test/test_proj-source/src/test_proj_object.h, /home/test/test_proj-source/src/object_model/test_proj_object.cc, /home/test/test_proj-source/src/test_proj_object.py, /home/test/test_proj-source/src/../mono/ObjectModel/test_proj_object.cs
/usr/lib/python2.7/dist-packages/funapi/json/__init__.pyc
Scanning dependencies of target test_proj
[ 21%] Building CXX object src/CMakeFiles/test_proj.dir/object_model/test_proj_object.cc.o
c++: internal compiler error: Killed (program cc1plus)
Please submit a full bug report,
with preprocessed source if appropriate.
See <file:///usr/share/doc/gcc-4.8/README.Bugs> for instructions.
make[2]: *** [src/CMakeFiles/test_proj.dir/object_model/test_proj_object.cc.o] Error 4
make[1]: *** [src/CMakeFiles/test_proj.dir/all] Error 2
make: *** [all] Error 2

혹시 어느곳을 확인해야되는지 가이드 해주시면 감사하겠습니다.

좋은 하루 되세요!

2018-04-12 12:30:32 +0900 edited answer 구글 결제 검증 관련 질문드립니다.

안녕하세요, 아이펀팩토리입니다. redirect_uri 의 경우 따로 설정하지 않으셔도 괜찮습니다.

funapi-biller 내에서 refresh_token 을 이용해서 access_token 을 발급 받아서 사용하는데요, 그 과정에서 올바른 값을 입력하지 않아서 정상적으로 access_token 을 가져오지 못하는 문제가 발생한 듯 보입니다 (로그상 구글쪽 통신과 실패시 응답 받은 부분은 아래에 해당합니다.

W0411 21:34:57.296624  3623 google_play_adapter.cc:112] status code is not OK(200): 400
W0411 21:34:57.296880  3623 google_play_adapter.cc:126] failed to get google api access token: {"error":"invalid_grant","error_description":"Bad Request"}

엔진 MANIFEST.json 에 입력한 입력하신 googleplay_refresh_token 은 어떤 방식으로 가져오셨는지 말씀해주시면 조금 더 확인이 가능할 것 같습니다.

2018-04-12 11:24:05 +0900 edited question 구글 결제 검증 관련 질문드립니다.

안녕하세요. 이제 결제 검증 쪽 구현하고 있는데 잘 안되어서 질문 드립니다. ㅠㅠ

I0411 21:34:57.043345  3601 billing_agent.cc:1401] begin to authenticate google api server account: google paly client id(~~.apps.googleusercontent.com)
I0411 21:34:57.043493  3601 google_play_adapter.cc:289] begin to refresh google api access token: ~~.apps.googleusercontent.com
I0411 21:34:57.043582  3601 google_play_adapter.cc:48] try to request google api access token: google client id(~~.googleusercontent.com), google client secret(...), google refresh token(4/~~)
W0411 21:34:57.296624  3623 google_play_adapter.cc:112] status code is not OK(200): 400
W0411 21:34:57.296880  3623 google_play_adapter.cc:126] failed to get google api access token: {"error":"invalid_grant","error_description":"Bad Request"}
W0411 21:34:57.297214  3623 google_play_adapter.cc:450] google play authentication failed: 1
W0411 21:34:57.297327  3623 google_play_adapter.cc:503] failed to refresh google api access token: google client id(~~.apps.googleusercontent.com)
W0411 21:34:57.297412  3623 billing_agent.cc:1229] failed to get google api access token: error(Funapi-Biller: wrong service provider authentication key(6)), session(85e88583-b80c-4702-bdec-5a907facfaf8(state: kCreated, client_id: ~~, gp_client_id:~~.apps.googleusercontent.com, gp_client_secret: ~~, gp_refresh_token: 4/~~))

대강 저런식으로 로그가 뜨는데요. 뭔가 메인 서버에 입력한 정보가 맞지 않아서 발생하는 것 같긴한데 구글쪽에서 refresh token 을 받아 오려할때,

https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/androidpublisher&response_type=code&access_type=offline&redirect_uri=...&client_id=...

부분에서 client_id 부분은 ~~.apps.googleusercontent.com 같은 값으로 넣어주는게 맞는것 같은데 redirect_uri 부분을 알수가 없네요. 혹시 이부분이 billing 서버의 특정 주소가 입력 되어야 하는건가요? 혹시 그렇다면 예시를 좀 부탁드려도 될지요?

미리 감사합니다. 좋은 하루 되세요!

2018-03-16 09:04:48 +0900 answered a question C++ 최신 표준 사용

C++ 11 / 14 / 17 기능을 모두 사용할 수 있는지는 컴파일러 버전에 따라 다릅니다. 그래서 현재 아이펀 엔진에 해당 플래그를 주시는 경우 다음과 같이 동작합니다.

  • GCC 5.0 미만인 경우: C++ 11 기능만 활성화합니다. (GCC 4.9 까지는 모든 C++14 기능이 들어가있지 않습니다; 또한 실험적으로 들어간 기능은 대부분 c++0x 플래그로 쓸 수 있습니다)
  • GCC 5.0 이상인 경우: C++ 11/14 기능을 활성화 합니다.

4월말 ubuntu 18.04 릴리즈 이후에는 해당 플랫폼에서 일부 C++17 기능이 활성화될 수 있습니다.