Ask Your Question

Jinuk's profile - activity

2019-06-05 15:14:00 +0900 commented answer Funapi Dashboard 설치 질문 드립니다.3

--publish=0.0.0.0:8000:8000 부분을 --publish={IP}:{port}:8000 으로 변경하면 됩니다.

2019-05-29 11:04:06 +0900 commented answer 패킷 관련해서 문의드립니다.

서버에서 무한정 메시지를 보내는게 아니라고 치면, 대부분의 경우 문제가 안될 정도의 양입니다. 게임 서버가 클라이언트 요청없이 보내는 메시지는 전체 전송하는 메시지나, 다른 클라이언트로 부터의 메시지며, 해당 양은 많아봐야 수십 - 수백 KiB 정도일 것으로 보입니다. 문제가 될 수 있다고 판단된다면 적절한 길이의 heartbeat (ping 기능 이용) 을 사용해서 해당 클라이언트를 구분하고 연결을 끊을 수 있을 것 같습니다.

2019-05-28 17:37:45 +0900 answered a question 패킷 관련해서 문의드립니다.

두 가지를 완벽히 구분할 방법은 없습니다. 두 가지를 구분하려면 패킷 캡쳐를 해서 실제로 전송했는지를 확인하셔야 합니다.

  1. 캡쳐결과 서버에서 보낸 메시지가 실제로 전송된 경우, 해당 메시지는 안드로이드 OS의 TCP 스택에서 대기하게 됩니다. (클라이언트가 백그라운드인 경우)
  2. 안드로이드가 충분히 많은 수의 메시지를 처리하지 않은 경우, TCP window가 부족해서 서버가 보내지 않는 경우도 가능합니다. (이 경우 패킷 캡쳐에서 서버가 메시지를 보낸 로그가 없습니다)

다만 위 두 경우 모두 클라이언트가 어느 쪽인지 스스로 인지하기는 어려우며, 구현 상으로도 별 차이 없을 것으로 보입니다.

어떤 이유에서 위 내용이 필요한지 알려주시면 답변드리기 쉬울 듯 합니다.

2019-04-18 15:14:57 +0900 commented answer 외부 서비스 인증 관련해서 문의 드립니다.
  1. 구글 개발자 콘솔에서 찾아서 입력하는게 가장 정확합니다.
  2. 1이 어려우시다면, 권장하지는 않지만 차선책으로 게임 서버 로그의 값을 입력해도 됩니다. 이 때 클라이언트는 변조되지 않았다고 확신할 수 있어야 합니다.
2019-04-18 14:32:16 +0900 commented answer 외부 서비스 인증 관련해서 문의 드립니다.

서버 응답으로 돌아온 값을 사용하시면 됩니다. 저 위의 azp, aud 로 넣은 내용에 해당합니다.

다만 이 방법은 임시 방편이며, 정식으로는 구글 개발자 콘솔의 안드로이드 앱과 연결된 프로젝트 계정의 OAuth Client ID에 해당하는 값을 넣어 주셔야 합니다. (해당 값이 옳바른 클라이언트 요청을 게임 서버가 받아서 구글 서버에 인증한 경우, 해당 응답에 적절한 azp, aud 로 오기 때문에 그 azp, aud 값을 써도 된다고 김인근님이 답변했습니다)

2019-04-18 12:08:10 +0900 edited answer 외부 서비스 인증 관련해서 문의 드립니다.

Google Play Game 인증시 정확한 로그는 아래와 같습니다.

W0418 10:54:21.489495 28075 google_play_game_authentication.cc:335] JWT key kid=3782d3f0bc89008d9d2c01730f765cfb19d3b70e does not found in preloaded JWKS
[New Thread 0x7fffd8fff700 (LWP 28181)]
[New Thread 0x7fffd87fe700 (LWP 28182)]
[Thread 0x7fffd8fff700 (LWP 28181) exited]
'CurlIoGroup' (0x6e15) 스레드가 종료되었습니다(코드: 0 (0x0)).
[Thread 0x7fffd87fe700 (LWP 28182) exited]
'CurlIoGroup' (0x6e16) 스레드가 종료되었습니다(코드: 0 (0x0)).
I0418 10:54:21.719036 28076 google_play_game_authentication.cc:287] Google JWKS: added a new key (kid=6f6781ba71199a658e760aa5aa93e5fc3dc752b5)
I0418 10:54:21.719355 28076 google_play_game_authentication.cc:287] Google JWKS: added a new key (kid=3782d3f0bc89008d9d2c01730f765cfb19d3b70e)
E0418 10:54:21.742616 28076 google_play_game_authentication.cc:167] Failed to authenticate google play. invalid app id: {"iss":"https://accounts.google.com","azp":"518278299668-gas35tgmlnrnh95a76atjkiskciqkrdr.apps.googleusercontent.com","aud":"518278299668-vh67rn9bfan7helm0dbs7159qmq3a1tf.apps.googleusercontent.com","sub":"118092920621741853644","iat":"1555551891","exp":"1555555491","alg":"RS256","kid":"3782d3f0bc89008d9d2c01730f765cfb19d3b70e","typ":"JWT"}
[Switching to Thread 0x7fffdeff8700 (LWP 28075)]
2019-04-12 12:00:44 +0900 edited question Matchmaking 관련해서 문의드립니다.

매치매이킹 요청시 크래쉬가 나는데요.
F0412 11:39:05.065615 25815 matchmaking.cc:645] Assert failed: started: 해당 부분 원인을 알수 있을까요?

디버깅 해보니 각각 다른 event 쓰레드에서 동시에 MatchmakingClient::StartMatchmaking 함수를 호출하고 있는 상황이며

콜스택은 아래 같습니다.

[Unknown/Just-In-Time compiled code]     
libglog.so.0!google::LogMessage::SendToLog()     
libglog.so.0!google::LogMessage::Flush()     
libglog.so.0!google::LogMessage::~LogMessage()   
fun::MatchmakingClient::StartMatchmaking2(long const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, fun::Json const&, boost::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, fun::MatchmakingClient::Match const&, fun::MatchmakingClient::MatchResult)> const&, boost::uuids::uuid const&, boost::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, fun::MatchmakingClient::Match const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)> const&, boost::posix_time::time_duration const&)  
fun::MatchmakingClient::StartMatchmaking(long const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, fun::Json const&, boost::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, fun::MatchmakingClient::Match const&, fun::MatchmakingClient::MatchResult)> const&, fun::MatchmakingClient::TargetServerSelection const&, boost::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::uuids::uuid const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)> const&, boost::posix_time::time_duration const&)

...... .... .. .

2019-04-05 14:18:53 +0900 commented answer Funapi Dashboard 설치 질문 드립니다.

-v /path/to/override:/etc/funapi_dashboard/override 에서 /path/to/override 에 해당하는 디렉터리를 설정 파일이 있는 디렉터리로 지정하셨는지 확인 부탁 드립니다.

{/path/to/override}/settings.py 란 파일이 존재해야 동작합니다. 해당 파일을 설정하는 부분은 링크하신 매뉴얼에 있습니다.

2019-04-05 10:05:41 +0900 answered a question Funapi Dashboard 설치 질문 드립니다.

컨테이너가 실행 중이 아닌 경우 나올 수 있는 오류 메시지입니다.

sudo systemctl status funapi-dashboard 로 서비스가 실행 중인지 확인해주시고, 실행되어 있지 않다면 sudo systemctl start funapi-dashboard 로 서비스를 실행한 후에 위 명령으로 진행하시면 됩니다.

2019-03-15 14:14:33 +0900 answered a question 서버 엔진 프레임 관련 질문입니다.

https://ifunfactory.com/engine/docume... 링크한 문서에서 설명하는 형태로 연동할 수 있을 것 같습니다.

2019-02-13 08:53:08 +0900 edited question Pong Game Server(C#) Caught signal: 6

아래와 같이 죽네요. 혹시 원인이나 조치방법이 짐작가시는게 있을까요? 필요하시면 서버를 열어드릴수도 있습니다만.

아래

Time Elapsed 00:00:01.3174070
[100%] Built target mono_dll_build
root@ubuntu:/game-pong-server-csharp/pongcs-build/debug# ./pongcs.lobby-local
[INFO] pongcs_server@ubuntu is starting.
I0213 00:22:36.836694 20824 main.cc:595] Engine version: 1.0.0-3837xenial
I0213 00:22:36.836931 20824 main.cc:601] Command line arguments: [pongcs_server.lobby]
I0213 00:22:36.836946 20824 main.cc:602] Server flavor: lobby
I0213 00:22:36.837049 20824 main.cc:616] Crashreporter initialized; .dmp will be written to /game-pong-server-csharp/pongcs-build/debug/dumps
I0213 00:22:36.880657 20824 capability.cc:261] Checking license for funapi1-runtime 1.0.0-3837xenial
I0213 00:22:37.611420 20824 main.cc:638] License info: {"production":false,"expires":"2019-Mar-12 14:51:59"}
I0213 00:22:37.627940 20824 manifest_handler.cc:682] libpongcs.so loaded.
I0213 00:22:37.628072 20824 main.cc:688] Loading Mono runtime and managed app: mono_dll_path=/game-pong-server-csharp/pongcs-source/mono/bin/Debug/Pongcs.dll
* Assertion at sgen-alloc.c:558, condition `tlab_next_addr_offset != -1' not met

I0213 00:22:37.629060 20824 fault.cc:198] Caught signal: 6 (Aborted)
2019-02-12 11:19:12 +0900 edited question Redis 접속 실패

AWS 인스턴스에 패키지 풀고 실행중 실행이 안되는 부분 로그입니다.

Redis 접속을 실패한다고 로그가 떠있어서 6370 포트가 닫혀있나 확인 해보니


I0211 16:07:07.366623  3228 manifest_handler.cc:751] Initializing Redis
E0211 16:07:07.366822  3228 redis_connection.cc:100] 1000 connection: Failed to connect to redis server: 127.0.0.1:6379, error code: 1, error description: Connection refused
E0211 16:07:07.367228  3228 redis_impl.cc:1035] Failed to connect to master server: 127.0.0.1:6379
E0211 16:07:07.367457  3228 redis_connection.cc:100] 0 connection: Failed to connect to redis server: 127.0.0.1:6379, error code: 1, error description: Connection refused
E0211 16:07:07.367661  3228 redis_impl.cc:1050] 0 connection: Failed to connect to redis server: 127.0.0.1:6379, Retrying.
E0211 16:07:07.367875  3228 redis_connection.cc:100] 1 connection: Failed to connect to redis server: 127.0.0.1:6379, error code: 1, error description: Connection refused
E0211 16:07:07.368062  3228 redis_impl.cc:1050] 1 connection: Failed to connect to redis server: 127.0.0.1:6379, Retrying.
E0211 16:07:07.368276  3228 redis_connection.cc:100] 2 connection: Failed to connect to redis server: 127.0.0.1:6379, error code: 1, error description: Connection refused
E0211 16:07:07.368468  3228 redis_impl.cc:1050] 2 connection: Failed to connect to redis server: 127.0.0.1:6379, Retrying.
E0211 16:07:07.368664  3228 redis_connection.cc:100] 3 connection: Failed to connect to redis server: 127.0.0.1:6379, error code: 1, error description: Connection refused
E0211 16:07:07.368842  3228 redis_impl.cc:1050] 3 connection: Failed to connect to redis server: 127.0.0.1:6379, Retrying.
E0211 16:07:07.369161  3228 redis_connection.cc:100] 500 connection: Failed to connect to redis server: 127.0.0.1:6379, error code: 1, error description: Connection refused
E0211 16:07:07.369352  3228 redis_impl.cc:104] RedisSubImpl::Initialize: Failed to connect to redis server: 127.0.0.1:6379

$ netstat -tupln
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:6010          0.0.0.0:*               LISTEN      -               
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      -               
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -               
tcp6       0      0 ::1:6010                :::*                    LISTEN      -               
tcp6       0      0 :::2181                 :::*                    LISTEN      -               
tcp6       0      0 :::33513                :::*                    LISTEN      -               
tcp6       0      0 :::22                   :::*                    LISTEN      -               
udp        0      0 0.0.0.0:68              0.0.0.0:*                           -

zookeeper.service     loaded active running   LSB: centralized coordination service

주키퍼의 경우 서비스가 실행되고 있고 2181 포트가 열려있는걸로 보입니다.

질문) 6379 포트가 열려 있지 않은데 어떻게하면 열수 있는건가요? (Redis 설치에 대해 궁금합니다)


I0211 16:07:07.976095  3228 manifest_handler.cc:780] Starting ZookeeperClient
I0211 16:07:07.976105  3228 zookeeper ...
(more)
2019-02-11 14:19:35 +0900 edited answer 패키지 설치 후 서비스 시작 중 Skipped signal handling.

aws 인스턴스 서버 INFO 로그 뒷부분이 없습니다. 기존 개발 서버에서는 다음과같이 정상적으로 실행됩니다.


Log file created at: 2019/02/08 03:31:39
Running on machine: Doublestroke-SeverCom
Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg
I0208 03:31:39.286231  6052 main.cc:595] Engine version: 1.0.0-3820xenial
I0208 03:31:39.286366  6052 main.cc:601] Command line arguments: [ccg_server_server.lobby]
I0208 03:31:39.286370  6052 main.cc:602] Server flavor: lobby
I0208 03:31:39.286401  6052 main.cc:616] Crashreporter initialized; .dmp will be written to /var/crash/funapi/ccg_server.lobby
I0208 03:31:39.737685  6052 main.cc:638] License info: {"production":false,"trial":true,"expires":"2019-Jun-02 04:38:26"}
I0208 03:31:39.747105  6052 manifest_handler.cc:682] libccg_server.so loaded.
I0208 03:31:39.747164  6052 main.cc:688] Loading Mono runtime and managed app: mono_dll_path=/usr/lib/ccg_server/lobby/CcgServer.dll //  **aws 인스턴스 서버는 이부분 까지 진행됩니다.**
I0208 03:31:39.752806  6052 runtime.cc:149] Mono assembly loaded: CcgServer, Version=1.0.6978.2355
I0208 03:31:39.752879  6052 runtime.cc:149] Mono assembly loaded: protobuf-net, Version=2.0.0.668
I0208 03:31:39.752940  6052 runtime.cc:149] Mono assembly loaded: funapi, Version=1.0.6977.25952
I0208 03:31:39.753011  6052 runtime.cc:149] Mono assembly loaded: Newtonsoft.Json, Version=9.0.0.0
I0208 03:31:39.753020  6052 runtime.cc:123] Mono assembly loaded: mscorlib, Version=4.0.0.0
I0208 03:31:39.753123  6052 runtime.cc:123] Mono assembly loaded: System, Version=4.0.0.0
I0208 03:31:39.762521  6052 manifest_handler.cc:751] Initializing HardwareInfo
I0208 03:31:39.762670  6052 hardware_info.cc:161] Found non-loopback AF_INET NIC: eno1, 192.168.0.---/255.255.255.0, dc:4a:3e:95:f3:42
I0208 03:31:39.762751  6052 hardware_info.cc:360] Trying to resolve an external IP through AWS API
I0208 03:31:39.762754  6052 hardware_info.cc:236] Invoking RESETful API: http://169.254.169.254/latest/meta-data/public-ipv4/
W0208 03:31:41.764416  6052 hardware_info.cc:250] Failed to invoke AWS API. Skipping: Timeout was reached
I0208 03:31:41.764508  6052 hardware_info.cc:363] Trying to resolve an external IP from NIC
W0208 03:31:41.764511  6052 hardware_info.cc:369] No NIC found. Skipping: eth0
I0208 03:31:41.764518  6052 hardware_info.cc:375] Trying to resolve a specified NAT info
I0208 03:31:41.764529  6052 hardware_info.cc:427] Resolved an external IP: 192.168.0.--- (nat:192.168.0.---:tcp+pbuf=7016:http+json=7012)0
W0208 03:31:41.764535  6052 hardware_info.cc:431] You specified how to get an external IP, but it seems the address is private. If your are running the server on your internal network for internal development, it would be OK. But if your server is deployed and should handle clients from any IP address, this server would not work.
I0208 03 ...
(more)
2019-02-08 16:15:56 +0900 edited question 패키지 설치 후 서비스 시작 중 Skipped signal handling.

서버개발 OS는 Ubuntu 14.04입니다.

서버 패키징 후 AWS 인스턴스에 서비스 환경 구축 후 패키지 설치까지 완료 했습니다.

서비스는 실행 중인데 아래와 같은 로그를 확인 해본결과

Skipped signal handling 으로 정상적인 실행이 안 되는 것 같은데 어떤 문제 인가요?


$ ubuntu@ip-172-31-43----:/var/log/funapi/ccg_server.lobby/glog$ vi ccg_server_server.lobby.INFO    
Log file created at: 2019/02/08 06:24:54    
Running on machine: ip-172-31-43----    
Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg    
I0208 06:24:54.608649  1249 main.cc:595] Engine version: 1.0.0-3820xenial    
I0208 06:24:54.608847  1249 main.cc:601] Command line arguments: [ccg_server_server.lobby]    
I0208 06:24:54.608853  1249 main.cc:602] Server flavor: lobby    
I0208 06:24:54.608896  1249 main.cc:616] Crashreporter initialized; .dmp will be written to /var/crash/funapi/ccg_server.lobby    
I0208 06:24:55.899564  1249 main.cc:638] License info: {"production":false,"trial":true,"expires":"2019-Jun-02 04:38:26"}    
I0208 06:24:56.033735  1249 manifest_handler.cc:682] libccg_server.so loaded.    
I0208 06:24:56.033849  1249 main.cc:688] Loading Mono runtime and managed app:     
mono_dll_path=/usr/lib/ccg_server/lobby/CcgServer.dll

$ ubuntu@ip-ip-172-31-43----:/var/log/funapi/ccg_server.lobby/glog$ vi ccg_server_server.lobby.ERROR

Log file created at: 2019/02/08 06:23:13

Running on machine:  ip-172-31-43----

Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg

**E0208 06:23:13.785326  1693 fault.cc:202] Skipped signal handling.**

ubuntu@ip-ip-172-31-43----:/var/log/funapi/ccg_server.lobby/glog$ vi ccg_server_server.lobby.WARNING

Log file created at: 2019/02/08 06:23:13

Running on machine:  ip-172-31-43----

Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg

**E0208 06:23:13.785326  1693 fault.cc:202] Skipped signal handling.**

2019-01-31 15:26:50 +0900 commented answer 대시보드 관련해서 문의드립니다.

매뉴얼을 따라 했다면, https://ifunfactory.com/engine/docume... 아래 부분을 서버 내의 디렉터리로 지정했는지 확인이 필요합니다.

  • /path/to/override: 서버 설정 디렉터리에 해당하는 디렉터리로 변경
  • /path/to/whisper: 통계 데이터를 저장할 디렉터리로 변경
2019-01-30 21:07:17 +0900 commented answer 대시보드 관련해서 문의드립니다.

위에서 sudo docker ps 해서 나오는 항목이 없다면, sudo systemctl start funapi-dashboard 중간 절차의 이 부분이 실행되지 않은 것으로 보입니다. 이 부분부터 다시 진행 해주시면 될 것 같습니다.

2019-01-30 10:33:11 +0900 commented answer 대시보드 관련해서 문의드립니다.

sudo docker ps | grep funapi-dashboard 로 나오는 컨테이너가 있는지 확인 바랍니다. 없다면 sudo docker ps 해서 나오는 목록을 알려주시면 확인해보겠습니다.

2019-01-29 14:23:29 +0900 answered a question 대시보드 관련해서 문의드립니다.
sudo docker exec \
    --env FUNAPI_DASHBOARD_SETTINGS=/etc/funapi_dashboard/override/settings.py \
    -it $(sudo docker ps | grep funapi-dashboard | cut -d' ' -f1) \
    python /etc/funapi_dashboard/manage.py syncdb

위 명령으로 실행 부탁 드리겠습니다. (중간의 funapi_dashboard 를 funapi-dashboard 로 변경했습니다) 해당 내용은 이후 릴리즈에서 문서에 반영하도록 하겠습니다.

2019-01-29 13:37:57 +0900 answered a question 대시보드 관련해서 문의드립니다.

해당 파일은 docker 이미지 내에 존재합니다.

docker images ifunfactory/funapi-dashboard 명령으로 사용 중인 이미지를 확인해주시면, 해당 이미지에 문제가 없는지 확인해드리겠습니다.

2019-01-29 13:22:59 +0900 edited question 대시보드 관련해서 문의드립니다.

Funapi Dashboard 설정 부분에서

$ sudo docker exec \
    --env FUNAPI_DASHBOARD_SETTINGS=/etc/funapi_dashboard/override/settings.py \
    -it $(sudo docker ps | grep funapi_dashboard | cut -d' ' -f1) \
    python /etc/funapi_dashboard/manage.py syncdb

입력시

/etc/funapi_dashboard/manage.py 파일이 없다고 나오는데요. 어떤 부분을 설치해야 해당 경로에 manage.py 파일이 생성되는지 문의 드립니다.

2018-12-14 13:40:46 +0900 edited question crash 관련 문의 드립니다.

서버 크래쉬와 함께아래 처럼 로그가 남았는데요.
원인 을 알수 있으까요.?

I1214 11:34:47.038450 23341 session_impl.cc:1149] SendMessage ignored. closed session: sid=dab35b64-2005-45eb-afec-aebccee0705c, msgtype=_sc_redirect
F1214 11:34:47.038494 23341 session_impl.cc:1276] Assert failed: state_ == kOpened:
E1214 11:34:47.039716 23341 framework.cc:58] System has been crashed. (Event=, 1.0.0-3624trusty)
2018-12-10 14:45:02 +0900 answered a question ORM 오브젝트 관련 문의 드립니다.

KEY 로 지정한 컬럼은 자동으로 인덱스가 생성됩니다.

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 내에서 이동하면 호출하지 않습니다)