Esempio n. 1
0
 private void StartListeningAsync()
 {
     Connected?.Invoke(serverIPEndPoint);
     while (true)
     {
         try{
             int    dataSize = TCPSegmentSizeFormater.ReceiveTCPSegmentSize(serverSocket).GetAwaiter().GetResult();
             byte[] data     = new byte[dataSize];
             ArraySegment <byte> dataSegment = new ArraySegment <byte>(data);
             int recievedData = 0;
             while (recievedData < dataSize)
             {
                 int lost = dataSize - recievedData;
                 if (lost > RecieveBufferLength)
                 {
                     lost = RecieveBufferLength;
                 }
                 ArraySegment <byte> tempSegment = dataSegment.SliceEx(recievedData, lost);
                 recievedData += serverSocket.ReceiveAsync(tempSegment, SocketFlags.None).GetAwaiter().GetResult();
             }
             RecieveDataEvent?.Invoke(dataSegment.Array, serverIPEndPoint);
         }catch (ObjectDisposedException) {
             return;
         }catch (SocketException) {
             ConnectionShutdown?.Invoke(serverIPEndPoint);
             if (!AutoReconnect)
             {
                 Reconnect().Wait();
             }
         }
     }
 }
Esempio n. 2
0
        private async void StartReceivingAsync(Socket clientSocket)
        {
            IPEndPoint iPEndPoint = clientSocket.RemoteEndPoint as IPEndPoint;

            while (true)
            {
                try
                {
                    int dataSize = await TCPSegmentSizeFormater.ReceiveTCPSegmentSize(clientSocket);

                    byte[] data = new byte[dataSize];
                    ArraySegment <byte> dataSegment = new ArraySegment <byte>(data);
                    int recieveSize = 0;
                    while (recieveSize < dataSize)
                    {
                        int bufferSize = dataSize - recieveSize;
                        if (bufferSize > RecieveBufferLength)
                        {
                            bufferSize = RecieveBufferLength;
                        }
                        ArraySegment <byte> partData = dataSegment.SliceEx(recieveSize, bufferSize);
                        recieveSize += await clientSocket.ReceiveAsync(partData, SocketFlags.None).ConfigureAwait(false);
                    }
                    if (recieveSize < 1)
                    {
                        throw new TCPProtocolException("Receive transfer data was damaged.");
                    }
                    RecieveDataEvent?.Invoke(dataSegment.Array, iPEndPoint);
                }
                catch (SocketException)
                {
                    bool success = DisconnectClient(iPEndPoint);
                    if (success)
                    {
                        return;
                    }
                }
                catch (TransferException)
                {
                    bool success = DisconnectClient(iPEndPoint);
                    if (success)
                    {
                        return;
                    }
                }
            }
        }
Esempio n. 3
0
        public async Task SendDataAsync(byte[] data, IPEndPoint recipient)
        {
            Socket recipientSocket;

            if (!clients.TryGetValue(recipient, out recipientSocket) || data == null)
            {
                throw new TCPProtocolException("Bad sending value.");
            }
            try
            {
                await TCPSegmentSizeFormater.SendTCPSegmentSize(recipientSocket, data.Length).ConfigureAwait(false);

                ArraySegment <byte> dataSegment = new ArraySegment <byte>(data);
                int sendData = 0;
                while (sendData < data.Length)
                {
                    int bufferSize = data.Length - sendData;
                    if (bufferSize > SendBufferLength)
                    {
                        bufferSize = SendBufferLength;
                    }
                    ArraySegment <byte> sliceData = dataSegment.SliceEx(sendData, bufferSize);
                    sendData += await recipientSocket.SendAsync(sliceData, SocketFlags.None).ConfigureAwait(false);
                }
                if (sendData < 1)
                {
                    throw new TCPProtocolException("Message format error.");
                }
            }
            catch (SocketException exce)
            {
                throw new TCPProtocolException("Connection shutdown.", exce);
            }
            catch (TransferException excep)
            {
                throw new TCPProtocolException("Undefined protocol.", excep);
            }
        }
Esempio n. 4
0
        public async Task SendDataAsync(byte[] data)
        {
            if (isConnected == false)
            {
                throw new TCPProtocolException("Dont Connected to server.");
            }
            if (data == null)
            {
                throw new TCPProtocolException("Bad sending value");
            }
            try{
                ArraySegment <byte> dataSegment = new ArraySegment <byte>(data);
                await TCPSegmentSizeFormater.SendTCPSegmentSize(serverSocket, data.Length);

                int send = 0;
                while (send < data.Length)
                {
                    int lost = data.Length - send;
                    if (lost > SendBufferLength)
                    {
                        lost = SendBufferLength;
                    }
                    ArraySegment <byte> tempBuffer = dataSegment.SliceEx(send, lost);
                    send += await serverSocket.SendAsync(tempBuffer, SocketFlags.None);
                }
                if (send < 1)
                {
                    throw new TCPProtocolException("${send} bytes send.Connection shutdown");
                }
            }catch (SocketException exc) {
                throw new TCPProtocolException("Connection error.", exc);
            }
            catch (TransferException excep) {
                throw new TCPProtocolException("Trasfer error.", excep);
            }
        }