Jump to content
Unity Insider Forum

socket.Reveive(Buffer) Unity hängt sich auf


BennIY

Recommended Posts

Guten Abend,

 

ich habe seit einiger Zeit ein Problem bei meinem Multiplayer Setup.

 

Ich erzeuge hier eine neue Verbindung:

   public static bool ConnectToServer()
   {
    socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(serverIP), 4242);
    try
    {
	    socket.Connect(ipe);
	    networkState = NetworkState.Connected;
	    return true;
    }
    catch
    {
	    networkState = NetworkState.NoResponse;
    }
    return false;
   }

 

Unity zeigt mir auch als NetworkState Connected an. Wenn ich aber nun die Methode aufrufen um den RX Buffer auszulesen hängt sich Unity während des Spielt auf und lässt sich nurnoch mit dem Taskmanager beenden.

 

       byte[] Buffer;
       int readBytes;
	    Buffer = new byte[socket.SendBufferSize];
	    readBytes = socket.Receive(Buffer);//Stop

Link zu diesem Kommentar
Auf anderen Seiten teilen

https://msdn.microso...4y8aff(v=vs.110).aspx:

If no data is available for reading, the Receive method will block until data is available, unless a time-out value was set by using Socket.ReceiveTimeout.

Blockiert wohl einfach.

 

In solchen Fällen starte ich meistens einen weiteren Thread, der dann das Lesen übernimmt.

http://www.albahari.com/threading/

Also ein Thread der aus dem Socket Daten bekommt und in eine Variable schreibt.

Der Main Thread ( also Unity in Update() z.B.) kann dann auf diese Variable zugreifen, sie eventuell schnell kopieren und dann weiterarbeiten mit den neuesten Daten.

Alternativ zum kopieren geht auch ein lock object:

http://www.albahari.com/threading/ auch hier

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ist richtig das war in einem Thread aber ich dachte ich schreibs in die Update. Ich probiere nochmal den Thread.

 

Heißt das, die Funktion geht in eine Schleife über bis Daten empfangen werden?

Scheint zu funktionieren, auf der Basis kann ich weiter arbeiten, dank dir.

Ja, da ist im Hintergrund sowas wie:

 

while(datareceived<=0)

{

Thread.Sleep(1);

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...