Automatic reconnection and buffer read from server

Post here your questions about the Objective-C API for SFS2X

Moderators: Lapo, Bax

mmilen
Posts: 219
Joined: 09 Nov 2010, 00:48
Contact:

Automatic reconnection and buffer read from server

Postby mmilen » 23 Feb 2011, 13:13

Lately I do notice that some intermittent network connection issue for fraction of a second can cause client to disconnect and never reconnect to the server session. My server runs the latest (commercial license RC2b) with 0 seconds reconnection timeout for the zone.

I have a buddy where we use two iPads to talk with Skype and play Bridge at the same time. What happens is that occasionally his Bridge client will disconnect (note that Skype is still running just fine and we continue yapping), I will check the server and will see that he is still logged in and there is some data buffered (queued). The client never reconnects. Quite possible this could be related to the isConnected inconsistency between SFClient and BitSwarmClient objects.
User avatar
cemuzunlar
Posts: 47
Joined: 26 Dec 2008, 00:45
Contact:

Postby cemuzunlar » 26 Feb 2011, 14:34

We!ll look into the issue.
Cem Uzunlar
Infosfer Game and Visualization Technologies
http://www.infosfer.com
contact@infosfer.com
User avatar
Bax
Site Admin
Posts: 4448
Joined: 29 Mar 2005, 09:50
Location: Italy
Contact:

Re: Automatic reconnection and buffer read from server

Postby Bax » 27 Feb 2011, 10:13

mmilen wrote:Lately I do notice that some intermittent network connection issue for fraction of a second can cause client to disconnect and never reconnect to the server session. My server runs the latest (commercial license RC2b) with 0 seconds reconnection timeout for the zone.


If the reconnection timeout is 0, of course the client will never reconnect.
That value means that the server will wait 0 seconds for the client to reconnect, before killing its session.
Try increasing it to 3-5 seconds.
Paolo Bax
The SmartFoxServer Team
jacques.chen
Posts: 27
Joined: 01 Aug 2011, 18:23

Postby jacques.chen » 11 Aug 2011, 00:53

Hello~

We met same reconnection problem as mmilen said.
And bax's suggestion seems not work.
Is there any other solution or we should check somewhere is codes?

Thanks!

Jacques
mmilen
Posts: 219
Joined: 09 Nov 2010, 00:48
Contact:

Postby mmilen » 11 Aug 2011, 01:22

As far as the intermittent staff goes definitely RC3 and 10 sec reconnection time frame worked well for me.
jacques.chen
Posts: 27
Joined: 01 Aug 2011, 18:23

Postby jacques.chen » 11 Aug 2011, 13:37

As far as the intermittent staff goes definitely RC3 and 10 sec reconnection time frame worked well for me.


Hello~

We tried this and not work.
Any other way you found?

Jacques
mmilen
Posts: 219
Joined: 09 Nov 2010, 00:48
Contact:

Postby mmilen » 11 Aug 2011, 13:57

Try this and let me know what happens. Establish a connection, now remove the ethernet cable from the server side and send something from the client. Reconnect the server was the connection reestablished. I have made some modifications to the SFSSmartFoxClient and bitSwarm isConnected functionality, that might be solving it for me.
jacques.chen
Posts: 27
Joined: 01 Aug 2011, 18:23

Postby jacques.chen » 11 Aug 2011, 16:26

Hello~bax, mmilen

I would like to share our server log for reference.
At first, the user successfully log in and open a room.
If he waits others to join too long, he will be kicked out and can't reconnect again until actually close game and reopen the game to log-in.
Or connect to server and a while no movement and then be kicked out.

We tried an additional way of new one other smartfoxserver to try to connect but unsuccessful. Client has no message and server in handshake.

==============================================
20:10:03,959 INFO [main] Extensions - {loginExt}: [Poring] Login extension
starting.
20:10:03,965 INFO [main] api.SFSApi - Room created: [ Room: AdminRoom, Id:
2, Group: default, isGame: false ]
20:10:03,969 INFO [main] core.AdminToolService - AdminTool Service started
20:10:04,590 INFO [main] http.SFSHttpServer - Http Server started.
20:10:04,643 WARN [main] bootLogger - Was not able to bind socket: { 123.0.
42.203:9933, (Tcp) }
20:10:04,650 INFO [main] v2.SmartFoxServer - Listening Sockets: { 127.0.0.1
:9933, (Tcp) } { 192.168.1.100:9933, (Tcp) }
20:10:04,651 INFO [main] v2.SmartFoxServer -
_____ _____ _____ ___ __ __
| __| __| __| |_ | | |
|__ | __|__ | | _|- -|
|_____|__| |_____| |___|__|__|
_____ _____ _____ ____ __ __
| __ | __| _ | \| | |
| -| __| | | |_ _|
|__|__|_____|__|__|____/ |_|
[ 2.0.0-RC1b ]

20:10:04,653 INFO [main] v2.SmartFoxServer - SmartFoxServer 2X (2.0.0-RC1b)
READY!
20:10:13,212 INFO [SocketReader] core.SocketAcceptor - Session created: { I
d: 1, Type: DEFAULT, Logged: No, IP: 192.168.1.199:57299 } on Server port: 9933
<---> 57299
20:10:13,257 INFO [com.smartfoxserver.v2.controllers.SystemController-1] contro
llers.SystemController - {IN}: Handshake
20:10:16,904 INFO [com.smartfoxserver.v2.controllers.SystemController-1] contro
llers.SystemController - {IN}: ManualDisconnection
20:10:16,915 WARN [com.smartfoxserver.v2.controllers.SystemController-1] contro
llers.SystemController -
java.lang.NullPointerException
com.smartfoxserver.v2.controllers.system.ManualDisconnection.execute(Man
ualDisconnection.java:29)
com.smartfoxserver.v2.controllers.SystemController.processRequest(System
Controller.java:127)
com.smartfoxserver.bitswarm.controllers.AbstractController.run(AbstractC
ontroller.java:96)
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
java.lang.Thread.run(Unknown Source)

20:10:16,917 INFO [SocketReader] sessions.DefaultSessionManager - Session r
emoved: { Id: 1, Type: DEFAULT, Logged: No, IP: 192.168.1.199:57299 }
20:10:17,484 INFO [SocketReader] core.SocketAcceptor - Session created: { I
d: 2, Type: DEFAULT, Logged: No, IP: 192.168.1.199:57302 } on Server port: 9933
<---> 57302
20:10:17,489 INFO [com.smartfoxserver.v2.controllers.SystemController-1] contro
llers.SystemController - {IN}: Handshake
20:10:25,615 INFO [SocketReader] sessions.DefaultSessionManager - Session r
emoved: { Id: 2, Type: DEFAULT, Logged: No, IP: 192.168.1.199:57302 }
20:10:42,870 INFO [SocketReader] core.SocketAcceptor - Session created: { I
d: 3, Type: DEFAULT, Logged: No, IP: 192.168.1.199:57303 } on Server port: 9933
<---> 57303
20:10:42,965 INFO [com.smartfoxserver.v2.controllers.SystemController-1] contro
llers.SystemController - {IN}: Handshake
20:10:43,089 INFO [com.smartfoxserver.v2.controllers.SystemController-1] contro
llers.SystemController - {IN}: Login
20:10:43,094 INFO [pool-1-thread-2] Extensions - {MyExtension}: test01 logi
n success!!!
20:10:43,098 INFO [pool-1-thread-2] api.SFSApi - Login in, { Zone: MyTest }
, ( User Name: test01, Id: 0, Priv: 0, Sess: 192.168.1.199:57303 )
20:10:43,290 INFO [com.smartfoxserver.v2.controllers.SystemController-1] contro
llers.SystemController - {IN}: JoinRoom
20:10:47,298 ERROR [com.smartfoxserver.v2.controllers.ExtensionController-1] con
trollers.ExtensionController -
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Exception: com.smartfoxserver.v2.exceptions.SFSRuntimeException
Message: Request handler not found: 'rank'. Make sure the handler is registered
in your extension using addRequestHandler()
Description: Error while handling client request in extension: { Ext: MyExtensio
n, Type: JAVA, Lev: ZONE, { Zone: MyTest }, {} }
Extension Cmd: rank
+--- --- ---+
Stack Trace:
+--- --- ---+
com.smartfoxserver.v2.extensions.SFSExtension.handleClientRequest(SFSExtension.j
ava:181)
com.smartfoxserver.v2.controllers.ExtensionController.processRequest(ExtensionCo
ntroller.java:137)
com.smartfoxserver.bitswarm.controllers.AbstractController.run(AbstractControlle
r.java:96)
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
java.lang.Thread.run(Unknown Source)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

20:10:55,357 INFO [com.smartfoxserver.v2.controllers.SystemController-1] contro
llers.SystemController - {IN}: ManualDisconnection
20:10:55,359 INFO [SocketReader] sessions.DefaultSessionManager - Session r
emoved: { Id: 3, Type: DEFAULT, Logged: Yes, IP: 192.168.1.199:57303 }
20:10:55,361 INFO [SocketReader] entities.SFSZone - User: test01 was discon
nected.
20:10:55,363 INFO [SocketReader] api.SFSApi - User disconnected: ( User Nam
e: test01, Id: 0, Priv: 0, Sess: 192.168.1.199:57303 )
20:10:56,362 INFO [SocketReader] core.SocketAcceptor - Session created: { I
d: 4, Type: DEFAULT, Logged: No, IP: 192.168.1.199:57304 } on Server port: 9933
<---> 57304
20:10:56,375 INFO [com.smartfoxserver.v2.controllers.SystemController-1] contro
llers.SystemController - {IN}: Handshake
20:10:57,325 WARN [com.smartfoxserver.v2.controllers.ExtensionController-1] con
trollers.ExtensionController -
com.smartfoxserver.v2.exceptions.SFSExtensionException: Extension Request refuse
d. Sender is not a User: { Id: 4, Type: DEFAULT, Logged: No, IP: 192.168.1.199:5
7304 }
com.smartfoxserver.v2.controllers.ExtensionController.processRequest(Ext
ensionController.java:65)
com.smartfoxserver.bitswarm.controllers.AbstractController.run(AbstractC
ontroller.java:96)
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
java.lang.Thread.run(Unknown Source)

20:10:58,524 WARN [com.smartfoxserver.v2.controllers.ExtensionController-1] con
trollers.ExtensionController -
com.smartfoxserver.v2.exceptions.SFSExtensionException: Extension Request refuse
d. Sender is not a User: { Id: 4, Type: DEFAULT, Logged: No, IP: 192.168.1.199:5
7304 }
com.smartfoxserver.v2.controllers.ExtensionController.processRequest(Ext
ensionController.java:65)
com.smartfoxserver.bitswarm.controllers.AbstractController.run(AbstractC
ontroller.java:96)
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
java.lang.Thread.run(Unknown Source)

20:10:59,026 WARN [com.smartfoxserver.v2.controllers.ExtensionController-1] con
trollers.ExtensionController -
com.smartfoxserver.v2.exceptions.SFSExtensionException: Extension Request refuse
d. Sender is not a User: { Id: 4, Type: DEFAULT, Logged: No, IP: 192.168.1.199:5
7304 }
com.smartfoxserver.v2.controllers.ExtensionController.processRequest(Ext
ensionController.java:65)
com.smartfoxserver.bitswarm.controllers.AbstractController.run(AbstractC
ontroller.java:96)
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
java.lang.Thread.run(Unknown Source)

20:10:59,343 WARN [com.smartfoxserver.v2.controllers.ExtensionController-1] con
trollers.ExtensionController -
com.smartfoxserver.v2.exceptions.SFSExtensionException: Extension Request refuse
d. Sender is not a User: { Id: 4, Type: DEFAULT, Logged: No, IP: 192.168.1.199:5
7304 }
com.smartfoxserver.v2.controllers.ExtensionController.processRequest(Ext
ensionController.java:65)
com.smartfoxserver.bitswarm.controllers.AbstractController.run(AbstractC
ontroller.java:96)
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
java.lang.Thread.run(Unknown Source)

20:11:02,093 WARN [com.smartfoxserver.v2.controllers.ExtensionController-1] con
trollers.ExtensionController -
com.smartfoxserver.v2.exceptions.SFSExtensionException: Extension Request refuse
d. Sender is not a User: { Id: 4, Type: DEFAULT, Logged: No, IP: 192.168.1.199:5
7304 }
com.smartfoxserver.v2.controllers.ExtensionController.processRequest(Ext
ensionController.java:65)
com.smartfoxserver.bitswarm.controllers.AbstractController.run(AbstractC
ontroller.java:96)
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
java.lang.Thread.run(Unknown Source)

20:11:02,457 WARN [com.smartfoxserver.v2.controllers.ExtensionController-1] con
trollers.ExtensionController -
com.smartfoxserver.v2.exceptions.SFSExtensionException: Extension Request refuse
d. Sender is not a User: { Id: 4, Type: DEFAULT, Logged: No, IP: 192.168.1.199:5
7304 }
com.smartfoxserver.v2.controllers.ExtensionController.processRequest(Ext
ensionController.java:65)
com.smartfoxserver.bitswarm.controllers.AbstractController.run(AbstractC
ontroller.java:96)
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
java.lang.Thread.run(Unknown Source)

20:11:04,630 WARN [com.smartfoxserver.v2.controllers.ExtensionController-1] con
trollers.ExtensionController -
com.smartfoxserver.v2.exceptions.SFSExtensionException: Extension Request refuse
d. Sender is not a User: { Id: 4, Type: DEFAULT, Logged: No, IP: 192.168.1.199:5
7304 }
com.smartfoxserver.v2.controllers.ExtensionController.processRequest(Ext
ensionController.java:65)
com.smartfoxserver.bitswarm.controllers.AbstractController.run(AbstractC
ontroller.java:96)
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
java.lang.Thread.run(Unknown Source)

20:11:05,295 WARN [com.smartfoxserver.v2.controllers.ExtensionController-1] con
trollers.ExtensionController -
com.smartfoxserver.v2.exceptions.SFSExtensionException: Extension Request refuse
d. Sender is not a User: { Id: 4, Type: DEFAULT, Logged: No, IP: 192.168.1.199:5
7304 }
com.smartfoxserver.v2.controllers.ExtensionController.processRequest(Ext
ensionController.java:65)
com.smartfoxserver.bitswarm.controllers.AbstractController.run(AbstractC
ontroller.java:96)
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
java.lang.Thread.run(Unknown Source)

20:11:05,956 WARN [com.smartfoxserver.v2.controllers.ExtensionController-1] con
trollers.ExtensionController -
com.smartfoxserver.v2.exceptions.SFSExtensionException: Extension Request refuse
d. Sender is not a User: { Id: 4, Type: DEFAULT, Logged: No, IP: 192.168.1.199:5
7304 }
com.smartfoxserver.v2.controllers.ExtensionController.processRequest(Ext
ensionController.java:65)
com.smartfoxserver.bitswarm.controllers.AbstractController.run(AbstractC
ontroller.java:96)
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
java.lang.Thread.run(Unknown Source)

20:11:06,662 WARN [com.smartfoxserver.v2.controllers.ExtensionController-1] con
trollers.ExtensionController -
com.smartfoxserver.v2.exceptions.SFSExtensionException: Extension Request refuse
d. Sender is not a User: { Id: 4, Type: DEFAULT, Logged: No, IP: 192.168.1.199:5
7304 }
com.smartfoxserver.v2.controllers.ExtensionController.processRequest(Ext
ensionController.java:65)
com.smartfoxserver.bitswarm.controllers.AbstractController.run(AbstractC
ontroller.java:96)
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
java.lang.Thread.run(Unknown Source)

20:11:07,092 WARN [com.smartfoxserver.v2.controllers.ExtensionController-1] con
trollers.ExtensionController -
com.smartfoxserver.v2.exceptions.SFSExtensionException: Extension Request refuse
d. Sender is not a User: { Id: 4, Type: DEFAULT, Logged: No, IP: 192.168.1.199:5
7304 }
com.smartfoxserver.v2.controllers.ExtensionController.processRequest(Ext
ensionController.java:65)
com.smartfoxserver.bitswarm.controllers.AbstractController.run(AbstractC
ontroller.java:96)
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
java.lang.Thread.run(Unknown Source)

20:11:07,457 WARN [com.smartfoxserver.v2.controllers.ExtensionController-1] con
trollers.ExtensionController -
com.smartfoxserver.v2.exceptions.SFSExtensionException: Extension Request refuse
d. Sender is not a User: { Id: 4, Type: DEFAULT, Logged: No, IP: 192.168.1.199:5
7304 }
com.smartfoxserver.v2.controllers.ExtensionController.processRequest(Ext
ensionController.java:65)
com.smartfoxserver.bitswarm.controllers.AbstractController.run(AbstractC
ontroller.java:96)
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
java.lang.Thread.run(Unknown Source)

20:11:07,924 WARN [com.smartfoxserver.v2.controllers.ExtensionController-1] con
trollers.ExtensionController -
com.smartfoxserver.v2.exceptions.SFSExtensionException: Extension Request refuse
d. Sender is not a User: { Id: 4, Type: DEFAULT, Logged: No, IP: 192.168.1.199:5
7304 }
com.smartfoxserver.v2.controllers.ExtensionController.processRequest(Ext
ensionController.java:65)
com.smartfoxserver.bitswarm.controllers.AbstractController.run(AbstractC
ontroller.java:96)
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
java.lang.Thread.run(Unknown Source)

20:11:08,326 WARN [com.smartfoxserver.v2.controllers.ExtensionController-1] con
trollers.ExtensionController -
com.smartfoxserver.v2.exceptions.SFSExtensionException: Extension Request refuse
d. Sender is not a User: { Id: 4, Type: DEFAULT, Logged: No, IP: 192.168.1.199:5
7304 }
com.smartfoxserver.v2.controllers.ExtensionController.processRequest(Ext
ensionController.java:65)
com.smartfoxserver.bitswarm.controllers.AbstractController.run(AbstractC
ontroller.java:96)
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
java.lang.Thread.run(Unknown Source)

20:11:08,661 WARN [com.smartfoxserver.v2.controllers.ExtensionController-1] con
trollers.ExtensionController -
com.smartfoxserver.v2.exceptions.SFSExtensionException: Extension Request refuse
d. Sender is not a User: { Id: 4, Type: DEFAULT, Logged: No, IP: 192.168.1.199:5
7304 }
com.smartfoxserver.v2.controllers.ExtensionController.processRequest(Ext
ensionController.java:65)
com.smartfoxserver.bitswarm.controllers.AbstractController.run(AbstractC
ontroller.java:96)
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
java.lang.Thread.run(Unknown Source)

20:11:15,701 INFO [SocketReader] sessions.DefaultSessionManager - Session r
emoved: { Id: 4, Type: DEFAULT, Logged: No, IP: 192.168.1.199:57304 }
[/quote]
jacques.chen
Posts: 27
Joined: 01 Aug 2011, 18:23

Postby jacques.chen » 11 Aug 2011, 16:30

mmilen wrote:Try this and let me know what happens. Establish a connection, now remove the ethernet cable from the server side and send something from the client. Reconnect the server was the connection reestablished. I have made some modifications to the SFSSmartFoxClient and bitSwarm isConnected functionality, that might be solving it for me.


Hi~mmilen

We'll tried this later.
So you solve this?

Jacques
User avatar
Bax
Site Admin
Posts: 4448
Joined: 29 Mar 2005, 09:50
Location: Italy
Contact:

Postby Bax » 12 Aug 2011, 09:49

jacques.chen wrote:If he waits others to join too long, he will be kicked out and can't reconnect again until actually close game and reopen the game to log-in.
Or connect to server and a while no movement and then be kicked out.

Maybe there's a misunderstanding here... I the user is disconnected for being idle, the reconnection system doesn't work of course, because the user was disconnected on purpose!
It is a different matter if instead the user is disconnected due to a sudden network glitch.
Paolo Bax
The SmartFoxServer Team
jacques.chen
Posts: 27
Joined: 01 Aug 2011, 18:23

Postby jacques.chen » 12 Aug 2011, 17:00

bax wrote:Maybe there's a misunderstanding here... I the user is disconnected for being idle, the reconnection system doesn't work of course, because the user was disconnected on purpose!
It is a different matter if instead the user is disconnected due to a sudden network glitch.


Hi~bax

What we met is that after disconnected from server, when iphone client needs to reconnect, it can't under the situation that network connection is fine.

Haven't you met this before?

And for now we are testing if previous version has same problem or not.
It not, we may consider moving to previous SFS (1.x or Pro).
(That will be another question about license because we bought 2000 user license for 2X already and wondering if we can move this license to 1.x or pro if that works for us.)

But of course, if 2X can solve this problem, that will be the best since we are stuck on this for a while and project deadline gets tight.

Please help us on this.

If you need more log or have any questions, let me know.

Jacques
mmilen
Posts: 219
Joined: 09 Nov 2010, 00:48
Contact:

Postby mmilen » 15 Aug 2011, 02:17

Read through the second part of this thread. It is about isConnected property of BitSwarm and SFSClient viewtopic.php?t=10161
jacques.chen
Posts: 27
Joined: 01 Aug 2011, 18:23

Postby jacques.chen » 15 Aug 2011, 04:01

It is the responsibility of the SFS Client to keep proper state. how come the low level BitSwarm protocol indicates it is connected when the SFS Client says it is not. This had nothing to do with handling states of the application. There is messed up code in setting uo properties for the SFS Client.


Hi~mmilen

I checked the thread you said and it sounds like the problem posted on that thread still not be resolved?

Have you tried changing to previous version of SFS? (1.x or pro)

Jacques
mmilen
Posts: 219
Joined: 09 Nov 2010, 00:48
Contact:

Postby mmilen » 15 Aug 2011, 10:46

It is to lately for me to go back to version SFS 1. I still have to run some test on my code and will let you know, but the customizations I had done did stabilize my game significantly. Give me a couple of days and I will post my code.
jacques.chen
Posts: 27
Joined: 01 Aug 2011, 18:23

Postby jacques.chen » 16 Aug 2011, 04:48

Hi~mmilen

Thanks so much and wait your further post.

Jacques

Return to “SFS2X iPhone / iPad / OSX API”

Who is online

Users browsing this forum: No registered users and 2 guests