PeerKit icon indicating copy to clipboard operation
PeerKit copied to clipboard

Connection successful only 10% of the time

Open sudeepag opened this issue 9 years ago • 12 comments

I have set up PeerKit as per the example from the Cards Against app and have managed to get two devices to connect to each other.

However, this connection is only successful ~10% of the time. The other times, .onDisconnect is called right away. Is there any reason why this is happening, or am I doing something wrong?

Also, what is the procedure to attempt a reconnection after the connection is unsuccessful? Should I call .transceive again after creating a new Transceiver?

sudeepag avatar Dec 20 '15 06:12 sudeepag

Also seeing this behavior -- any updates?

danshev avatar Jan 13 '16 06:01 danshev

Can you confirm that the problem is with PeerKit rather than Multipeer Connectivity? MPC itself isn't necessarily a paragon of reliability.

jpsim avatar Jan 13 '16 06:01 jpsim

Fair point; will investigate MPC directly.

Any guidance on @sudeepag 's question:

"Also, what is the procedure to attempt a reconnection after the connection is unsuccessful? Should I call .transceive again after creating a new Transceiver?"

danshev avatar Jan 13 '16 16:01 danshev

I'm not sure, I haven't touched PeerKit in a while.

jpsim avatar Jan 13 '16 17:01 jpsim

@danshev Any progress on this? I'm noticing the same issue with my own app, though I used the ConnectionManager struct from Cards Against.

dkun7944 avatar Sep 07 '16 22:09 dkun7944

@dkun7944 unfortunately, I concluded it was the general unreliability of the MPC framework.

danshev avatar Sep 07 '16 22:09 danshev

I found that problem is in Advertiser class in didReceiveInvitationFromPeer handler: let accept = mcSession.myPeerID.hashValue > peerID.hashValue Most of the time it resolves to "false" which lead to disconnection. If I change it to "true" peers connecting successfully all the time. @jpsim can you please review this line? Why current peerID hash should be greater then external peerID hash for accepting connection?

pdyakov avatar Sep 29 '16 12:09 pdyakov

👍

ashtonmeuser avatar Dec 12 '16 03:12 ashtonmeuser

I ran into similar problems, and eventually traced it back to the same place that @pdyakov did... my guess is that this test might be here to prevent an Advertiser from accepting an invitation from a Browser that was running on the same device (as in the case of transceiving)? If so, it should probably be comparing the hashValue of myPeerID/peerID's displayName properties. I've made that change in my local version of PeerKit, and it seems to be helping quite a lot, but am not confident enough in my understanding of the issue to submit a pull request. @jpsim, I'd be happy to do so if my reasoning is correct.

stevenbedrick avatar Feb 10 '17 23:02 stevenbedrick

I believe this is to fix a problem in iOS7 https://developer.apple.com/library/content/qa/qa1869/_index.html

If you don't need to support iOS 7 you can just accept invitation.

qiulang avatar Feb 24 '17 06:02 qiulang

That certainly does appear to be the explanation, thanks, @qiulang!

stevenbedrick avatar Feb 24 '17 16:02 stevenbedrick

I think the main problem with current implementation is when peers first connected then disconnected, they won't connect again. Because when after they accept the invitation, advertiser.stopAdvertising(). So I added a state property in Session and re-start advertising when disconnect.

qiulang avatar Feb 27 '17 15:02 qiulang