Исключение «Дескриптор не является сокетом» - PullRequest
0 голосов
/ 14 декабря 2018

Я получаю исключение после отключения сокета вручную:

Дескриптор не является сокетом 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...