protected static void ReadFromStreamWriteToSocket(SocketAsyncEventArgs socketAsyncEventArgs, ulong numberOfBytesToSend, Stream sourceStream)
        {
            const int BUFFER_SIZE = 4096;
            ulong     bytesSent   = 0;

            do
            {
                SocketAsyncEventArgsUserToken userToken = (SocketAsyncEventArgsUserToken)socketAsyncEventArgs.UserToken;
                int    bytesRead, bytesTransfered = 0;
                byte[] bytesToSend        = ReadFromStream(sourceStream, BUFFER_SIZE, out bytesRead);

                if (bytesRead == 0)
                {
                    break;
                }

                socketAsyncEventArgs.SetBuffer(bytesToSend, 0, bytesToSend.Length);

                SocketError      resultError = SocketError.Success;
                ManualResetEvent sendLock = new ManualResetEvent(false);
                EventHandler <SocketAsyncEventArgs> sendCallback = (sender, args) => { resultError = args.SocketError; bytesTransfered = args.BytesTransferred; sendLock.Set(); };

                userToken.Socket.InvokeAsyncMethod(userToken.Socket.SendAsync, sendCallback, socketAsyncEventArgs);
                sendLock.WaitOne();
                socketAsyncEventArgs.Completed -= sendCallback;

                if (resultError != SocketError.Success)
                {
                    throw new SocketException((int)resultError);
                }

                bytesSent += (ulong)bytesTransfered;

                if (bytesRead < BUFFER_SIZE)
                {
                    break;
                }
            }while (bytesSent < numberOfBytesToSend);

            if (bytesSent < numberOfBytesToSend)
            {
                throw new InvalidOperationException(string.Format("File upload failed and was aborted after sending {0} of {1} bytes.", bytesSent, numberOfBytesToSend));
            }
        }
Beispiel #2
0
        private KeyValuePair <SocketError, string> ReceiveMessage(SocketAsyncEventArgs e)
        {
            if (e.SocketError != SocketError.Success)
            {
                Disconnect();
                return(new KeyValuePair <SocketError, string>(e.SocketError, null));
            }

            SocketAsyncEventArgsUserToken userToken = (SocketAsyncEventArgsUserToken)e.UserToken;

            byte[] sizeBuffer = new byte[RECEIVE_BUFFER_SIZE];
            e.SetBuffer(sizeBuffer, 0, sizeBuffer.Length);
            SocketError resultError = SocketError.Success;

            ManualResetEvent receiveLock   = new ManualResetEvent(false);
            string           resultMessage = null;
            EventHandler <SocketAsyncEventArgs> receiveCallback = (sender, args) =>
            {
                if (args.SocketError != SocketError.Success)
                {
                    resultError = args.SocketError;
                    receiveLock.Set();
                    return;
                }

                byte[] buffer = new byte[e.BytesTransferred];
                Array.Copy(e.Buffer, e.Offset, buffer, 0, e.BytesTransferred);
                resultMessage = Encoding.UTF8.GetString(e.Buffer, e.Offset, e.BytesTransferred);
                receiveLock.Set();

                if (resultMessage.Length == 0)
                {
                    Disconnect();
                }
            };

            userToken.Socket.InvokeAsyncMethod(userToken.Socket.ReceiveAsync, receiveCallback, e);
            receiveLock.WaitOne();
            e.Completed -= receiveCallback;

            return(new KeyValuePair <SocketError, string>(resultError, resultMessage));
        }
        protected static void SendFileTransferKey(SocketAsyncEventArgs socketAsyncEventArgs, string fileTransferKey)
        {
            SocketAsyncEventArgsUserToken userToken = (SocketAsyncEventArgsUserToken)socketAsyncEventArgs.UserToken;

            byte[] messageBytes = Encoding.UTF8.GetBytes(fileTransferKey);
            socketAsyncEventArgs.SetBuffer(messageBytes, 0, messageBytes.Length);

            SocketError      resultError = SocketError.Success;
            ManualResetEvent sendLock    = new ManualResetEvent(false);
            EventHandler <SocketAsyncEventArgs> sendCallback = (sender, args) => { resultError = args.SocketError; sendLock.Set(); };

            userToken.Socket.InvokeAsyncMethod(userToken.Socket.SendAsync, sendCallback, socketAsyncEventArgs);
            sendLock.WaitOne();
            socketAsyncEventArgs.Completed -= sendCallback;

            if (resultError != SocketError.Success)
            {
                throw new SocketException((int)resultError);
            }
        }
            private void Upload_StartSendingData(SocketAsyncEventArgs socketAsyncEventArgs)
            {
                if (AbortFunction != null && AbortFunction(FileTransferKey))
                {
                    CloseConnection();
                    return;
                }

                SocketAsyncEventArgsUserToken userToken = (SocketAsyncEventArgsUserToken)socketAsyncEventArgs.UserToken;
                int bytesRead;

                byte[] bytesToSend = ReadFromStream(DataStream, RECEIVE_BUFFER_SIZE, out bytesRead);

                if (bytesRead == 0)
                {
                    OnError(new InvalidOperationException(string.Format("File upload failed and was aborted after sending {0} of {1} bytes.", Processed, Size)));
                    return;
                }

                socketAsyncEventArgs.SetBuffer(bytesToSend, 0, bytesToSend.Length);
                userToken.Socket.InvokeAsyncMethod(userToken.Socket.SendAsync, Upload_FinishedSendingData, socketAsyncEventArgs);
            }