Я получаю исключение после отключения сокета вручную:
Дескриптор не является сокетом UnityEngine.Debug: Log (Object) ClientTCP: OnReceive () (в Assets / Scripts / ClientTCP.cs: 95) ClientTCP: ConnectCallback (IAsyncResult) (в разделе Assets / Scripts / ClientTCP.cs: 37) System.Net.Sockets.Worker: Connect ()
Я думал, что при включении «закрывается»Цикл "flag, my" while (! closed) OnReceive () "должен прекратиться.
И когда этот метод получает 0 байтов, он должен вывести« Disconnected from server »и установить для этого флага значение True.
И это действительно сработало так: я получал сообщение «Отключено от сервера» в Unity.
Я ничего не изменил в коде, но теперь при появлении «_clientSocket.Disconnect (true);»Я получаю упомянутое исключение.
Не могли бы вы взглянуть на то, что я делаю неправильно?
using System;
using System.Net.Sockets;
using System.Net;
using Bindings;
using UnityEngine;
public class ClientTCP : MonoBehaviour
{
public static Socket _clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
private byte[] _asyncbuffer = new byte[1024];
private bool closed;
public string IP_ADDRESS;
public int PORT;
public void ConnectToServer()
{
closed = false;
Debug.Log("Connecting to server...");
_clientSocket.BeginConnect(IP_ADDRESS, PORT, new AsyncCallback(ConnectCallback), _clientSocket);
}
private void ConnectCallback(IAsyncResult asyncResult)
{
_clientSocket.EndConnect(asyncResult);
while (!closed)
{
OnReceive(); //Line 37
}
}
public void DisconnectFromServer()
{
_clientSocket.Disconnect(true);
closed = true;
}
private void OnReceive()
{
byte[] _sizeinfo = new byte[4];
byte[] _receivedbuffer = new byte[1024];
int totalread = 0, currentread = 0;
try
{
currentread = totalread = _clientSocket.Receive(_sizeinfo); //Line 58
if (totalread <= 0)
{
Debug.Log("Disconnected from server");
closed = true;
}
else
{
while (totalread < _sizeinfo.Length && currentread > 0)
{
currentread = _clientSocket.Receive(_sizeinfo, totalread, _sizeinfo.Length - totalread, SocketFlags.None);
totalread += currentread;
}
int messagesize = 0;
messagesize |= _sizeinfo[0];
messagesize |= (_sizeinfo[1] << 8);
messagesize |= (_sizeinfo[2] << 16);
messagesize |= (_sizeinfo[3] << 24);
byte[] data = new byte[messagesize];
totalread = 0;
currentread = totalread = _clientSocket.Receive(data, totalread, data.Length - totalread, SocketFlags.None);
while (totalread < messagesize && currentread > 0)
{
currentread = _clientSocket.Receive(data, totalread, data.Length - totalread, SocketFlags.None);
totalread += currentread;
}
ClientHandleNetworkData.HandleNetworkInformation(data);
}
}
catch (Exception ex)
{
Debug.Log(ex.Message); //Line 95, here the exception is thrown
closed = true;
}
}
ex.ToString () дает следующее:
System.Net.Sockets.SocketException: дескриптор не является сокетом
в System.Net.Sockets.Socket.Receive (буфер System.Byte []) [0x00000] в: 0 в ClientTCP.OnReceive () [0x0001e] в /Users/nidere/Projects/Unity/OverWaste/Assets/Scripts/ClientTCP.cs:58 UnityEngine.Debug: журнал (объект) ClientTCP: OnReceive () (в ресурсах / сценариях / ClientTCP.cs: 95)ClientTCP: ConnectCallback (IAsyncResult) (в разделе Assets / Scripts / ClientTCP.cs: 37) System.Net.Sockets.Worker: Connect ()
58, строка:
currentread = totalread = _clientSocket.Receive(_sizeinfo);