Raknet connection issue on Unity3D + iOS (il2cpp)

425 views Asked by At

I have weird issue running the last version of Raknet on iOS with Unity3D: I get CONNECTION_ATTEMPT_FAILED when trying to connect to the server.

Now let's me detail the issue:

he exact same Library connects fine when used in an ObjectiveC application, so the issue seems to be Unity3D related.

I already managed to pinpoint my issue to be located in Raknet reliability layer:

Apparently, during the last step of the connection process (when the connection handshake as been completed) the reliability layer of the server thinks that the ID_CONNECTION_REQUEST packet received from the client is an acknowledgment instead of a message. Therefore it doesn't answer. Ultimately after a few tries, (and a 10s timeout) the client fails with the CONNECTION_ATTEMPT_FAILED error.

Does anybody there as an idea? I will update the question when I manage to get more info.

Update

We are using Unity3D 5.1.1f1

We managed to find a workaround! See answer for more information. As the workaround doesn't tell us much about what really happened, I would gladly hear some C++/XCode/Unity/iOS/AppleLLVM6.1 experts around here explain what really happened.

1

There are 1 answers

0
Eilistraee On BEST ANSWER

The issue was that the Raknet header wasn't properly generated by the iOS client. Namely we were sending ACK messages in place of simple packets. The rest of the message was considered as garbage by the server and the packet was dropped. The client kept trying to send the corrupted handshake packet a few times before timeouting.

This doesn't tell us why, doesn't it? Apparently the serialize method of the class DatagramHeaderFormat wasn't called as it should have been when running Raknet in Unity (iOS). Something else (and I don't know what) was linked in place of this method and was filling the BitStream with a corrupted header.

I am quite sure that the serialize method wasn't called because printf calls from inside weren't displayed in the console.

We renamed DatagramHeaderFormat::serialize into DatagramHeaderFormat::serializeHeader and... voila, it works.

Now I only want to understand what did the compiler (and why).