Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 12 Next capture
2021 2022 2023
1 capture
12 Jun 22 - 12 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
0
Question by crazyToby · Nov 16, 2018 at 10:58 AM · androidil2cppsocket

android use il2cpp backend,continuous Socket.BeginReceive calls return uncontinuous content。

untiy version: unity 2017.4.11f1 android use il2cpp backend,build apk and run in device(huawei honor).

My game uses tcp socket to communicate message between client and server. The ollowing script codes show the basic socket connect and receive logic.

public class NetConnection { public void Connect(string address, ushort port, int timeout) { try { socket.BeginConnect(address, port, new AsyncCallback(this.HandleConnct), this); } catch (SocketException e) { OnConnectError(e.SocketErrorCode); }

     timerConnect.Interval = timeout;
     timerConnect.Elapsed += new System.Timers.ElapsedEventHandler(HandleConnectTimeout);
     timerConnect.Start();
 }

 private void HandleConnectTimeout(object obj, System.Timers.ElapsedEventArgs args)
 {
     timerConnect.Stop();
     timerConnect.Elapsed -= HandleConnectTimeout;

     OnConnectError(SocketError.TimedOut);
 }

 private void HandleConnct(IAsyncResult ar)
 {
     try
     {
         timerConnect.Stop();
         timerConnect.Elapsed -= HandleConnectTimeout;

         socket.EndConnect(ar);

         PostRecv();
     }
     catch (SocketException e)
     {
         OnConnectError(e.SocketErrorCode);
     }
 }

 private void PostRecv()
 {
     NetPacket p = new NetPacket();
     socket.BeginReceive(p.headBuffer.buffer, 0, NetPacket.headerLength, SocketFlags.None, new AsyncCallback(this.HandleHeaderRecv), p);
 }

 private void HandleHeaderRecv(IAsyncResult ar)
 {
     try
     {
         int transferd = socket.EndReceive(ar);
         if (transferd == 0)
             throw new SocketException((int)SocketError.ConnectionReset);

         NetPacket p = ar.AsyncState as NetPacket;

         p.headBuffer.length += transferd;
         if (p.headBuffer.length < NetPacket.headerLength)
         {
             socket.BeginReceive(
                 p.headBuffer.buffer,
                 p.headBuffer.length,
                 NetPacket.headerLength - p.headBuffer.length,
                 SocketFlags.None,
                 new AsyncCallback(this.HandleHeaderRecv), p);
         }
         else
         {
             if (!p.decodeHeader())
             {
                 OnError(SocketError.ProtocolNotSupported);
             }
             else
             {
                 p.bodyBuffer.Resize(p.payloadLength);
                 socket.BeginReceive(p.bodyBuffer.buffer, 0, p.payloadLength, SocketFlags.None, new AsyncCallback(this.HandleBodyRecv), p);
             }
         }
     }
     catch (SocketException e)
     {
         OnError(e.SocketErrorCode);
     }
 }

 private void HandleBodyRecv(IAsyncResult ar)
 {
     try
     {
         int transferd = socket.EndReceive(ar);

         NetPacket p = ar.AsyncState as NetPacket;

         p.bodyBuffer.length += transferd;
         if (p.bodyBuffer.length < p.payloadLength)
         {
             socket.BeginReceive(
                 p.bodyBuffer.buffer,
                 p.bodyBuffer.length,
                 p.payloadLength - p.bodyBuffer.length,
                 SocketFlags.None,
                 new AsyncCallback(this.HandleBodyRecv), p);
         }
         else
         {
             p.decode(seed_);
             FinishRecvPacket(p);
         }
     }
     catch (SocketException e)
     {
         OnError(e.SocketErrorCode);
     }
 }

 private void FinishRecvPacket(NetPacket p)
 {
     PostRecv();
 }

 private void OnError(SocketError err)
 {
     this.Close();
 }

 private void OnConnectError(SocketError err)
 {
     this.Close();
 }

}

This script works very well when using mono backend. But once switch to il2cpp backend, I encountered this problem sometimes. THE Continuous Socket.BeginReceive calls do not return continuous content! I tried to use wireshark capturing the related TCP net package.After comparing with wireshark captured data and result of beginreceive result, I find out the continuous Socket.beginreceive calls skip some bytes in the net package. The comparing result as followed: Is this a bug of unity android il2cpp or something wrong in my code?

Any hint is appreciated, thx!

result.png (125.6 kB)
Comment
Add comment · Show 1
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image thomh_unity · May 13, 2019 at 09:26 AM 0
Share

Hello crazyToby,

can you please provide some additional information:

  • $$anonymous$$inimum API Level

  • Target API Level

  • Scripting Runtime Version

  • API compatibility level

  • ND$$anonymous$$ version



Thank you in advance,
Thom.

0 Replies

· Add your reply
  • Sort: 

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

213 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Native plugin JNI_OnLoad/UnitySetGraphicsDevice not called when using IL2CPP on Android 0 Answers

Why IL2CPP increases ANR percent ? 1 Answer

Memory usage in Profiler much less than on actual device 1 Answer

Get a fatal error in unity CIL linker 1 Answer

Debug IL2CPP Android build on device 1 Answer


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges