private void Form1_Load(object sender, EventArgs e) { NewFileReceived += new FileReceivedEventHandler(Form1_NewFileReceived); }
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); } } }