Exemplo n.º 1
0
 private void Form1_Load(object sender, EventArgs e)
 {
     NewFileReceived += new FileReceivedEventHandler(Form1_NewFileReceived);
 }
Exemplo n.º 2
0
        protected void WaitForFile(Socket socket, FileReceivedEventHandler fileReceivedCallback, int fileSize, int bufferSize = DefaultBufferSize, byte[] previousPart = null, int currentPart = 0, int totalParts = 1)
        {
            if (currentPart == 0)
            {
                totalParts = (int)Math.Ceiling(Convert.ToDouble(fileSize) / Convert.ToDouble(bufferSize));
            }
            var buffer = new byte[bufferSize];            
            try
            {
                SocketError errorCode;
                socket.BeginReceive(buffer, 0, bufferSize, 0, out errorCode, asyncResult =>
                {
                    byte[] newPart;
                    Debug.WriteLine("RECEIVING FILE " + currentPart + "/" + totalParts);
                    var bufferRealSize = buffer.Length;
                    if(fileSize <= bufferSize)
                    {
                        bufferRealSize = fileSize;
                    }                    
                    else if(currentPart == totalParts - 1)
                    {
                        bufferRealSize = fileSize - (currentPart*bufferSize);
                    }
                    Array.Resize(ref buffer, bufferRealSize);

                    if (buffer.Length == 0 && previousPart == null)
                    {
                        newPart = null;
                    }
                    else if (buffer.Length == 0 && previousPart != null)
                    {
                        newPart = previousPart;
                    }
                    else if (previousPart != null)
                    {
                        var newPartLength = previousPart.Length + buffer.Length;
                        var bufferLength = buffer.Length;
                        if (newPartLength > fileSize)
                        {
                            newPartLength = fileSize;
                            bufferLength = fileSize - previousPart.Length;
                        }
                        newPart = new byte[newPartLength];
                        Buffer.BlockCopy(previousPart, 0, newPart, 0,
                                         previousPart.Length);
                        Buffer.BlockCopy(buffer, 0, newPart, previousPart.Length,
                                         bufferLength);
                    }
                    else
                    {
                        newPart = buffer;
                    }

                    if (newPart == null || newPart.Length < fileSize)
                    {
                        WaitForFile(socket, fileReceivedCallback, fileSize, bufferSize, newPart, currentPart + 1, totalParts);
                        return;
                    }

                    try
                    {
                        socket.EndReceive(asyncResult);
                    }
                    catch (Exception exception)
                    {
                        if (OnErrorOcurred != null)
                        {
                            OnErrorOcurred(exception);
                        }
                        if (OnSocketDisconnected != null)
                        {
                            OnSocketDisconnected(socket);
                        }
                        return;
                    }

                    if (fileReceivedCallback != null)
                    {
                        fileReceivedCallback(newPart);
                    }
                }, null);
            }
            catch (Exception exception)
            {
                if (OnErrorOcurred != null)
                {
                    OnErrorOcurred(exception);
                }
                if (OnSocketDisconnected != null)
                {
                    OnSocketDisconnected(socket);
                }
            }
            
        }