├── README.md
├── TcpMultiFileTransfer.sln
├── TcpMultiFileTransfer
├── App.config
├── FrmMain.Designer.cs
├── FrmMain.cs
├── FrmMain.resx
├── Listen.cs
├── Program.cs
├── Properties
│ ├── AssemblyInfo.cs
│ ├── Resources.Designer.cs
│ ├── Resources.resx
│ ├── Settings.Designer.cs
│ └── Settings.settings
├── ReceiveFileInfo.cs
├── Receiver.cs
├── ReceiverEngine.cs
├── Resources
│ └── coder.png
├── Sender.cs
├── TcpMultiFileTransfer.csproj
└── filetransfer.ico
├── receivescrn.png
└── sendscrn.png
/README.md:
--------------------------------------------------------------------------------
1 | # TcpMultiFileTransfer
2 |
3 | **TcpMultiFileTransfer** is a file transfer tool that allows users to send multiple files simultaneously using TCP protocol. This tool is designed for efficient and reliable file transfers between client and server over a network.
4 |
5 | ## Features
6 | - Supports multiple file transfers at the same time using TCP.
7 | - Efficient and reliable file transfer between client and server.
8 | - Simple interface for both client and server-side management.
9 | - Ensures data integrity during transfer.
10 |
11 | ## Technologies Used
12 | - **C#** for backend implementation.
13 | - **TCP protocol** for reliable file transfers.
14 |
15 | ## How to Use
16 | ### 1. Clone the Repository:
17 | ```bash
18 | git clone https://github.com/dursunkatar/TcpMultiFileTransfer.git
19 | ```
20 | ### 2. Open and Run:
21 | - Open the project in Visual Studio and build the solution.
22 | - Run the application and select the files you want to transfer.
23 | - Set up the **server** and **client** to establish a connection via TCP.
24 |
25 | ### 3. Transfer Files:
26 | - After establishing the connection, choose the files to transfer from the client side, and the server will receive them.
27 |
28 | ## ScreenShots
29 | 
30 |
31 | 
32 |
33 |
--------------------------------------------------------------------------------
/TcpMultiFileTransfer.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio 15
4 | VisualStudioVersion = 15.0.28307.271
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TcpMultiFileTransfer", "TcpMultiFileTransfer\TcpMultiFileTransfer.csproj", "{9A880FDB-507F-41C4-993E-74B481BD7F72}"
7 | EndProject
8 | Global
9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
10 | Debug|Any CPU = Debug|Any CPU
11 | Release|Any CPU = Release|Any CPU
12 | EndGlobalSection
13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
14 | {9A880FDB-507F-41C4-993E-74B481BD7F72}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
15 | {9A880FDB-507F-41C4-993E-74B481BD7F72}.Debug|Any CPU.Build.0 = Debug|Any CPU
16 | {9A880FDB-507F-41C4-993E-74B481BD7F72}.Release|Any CPU.ActiveCfg = Release|Any CPU
17 | {9A880FDB-507F-41C4-993E-74B481BD7F72}.Release|Any CPU.Build.0 = Release|Any CPU
18 | EndGlobalSection
19 | GlobalSection(SolutionProperties) = preSolution
20 | HideSolutionNode = FALSE
21 | EndGlobalSection
22 | GlobalSection(ExtensibilityGlobals) = postSolution
23 | SolutionGuid = {4440ACCF-157C-4F06-BFED-71CB44F67652}
24 | EndGlobalSection
25 | EndGlobal
26 |
--------------------------------------------------------------------------------
/TcpMultiFileTransfer/App.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/TcpMultiFileTransfer/FrmMain.Designer.cs:
--------------------------------------------------------------------------------
1 | namespace TcpMultiFileTransfer
2 | {
3 | partial class FrmMain
4 | {
5 | ///
6 | /// Required designer variable.
7 | ///
8 | private System.ComponentModel.IContainer components = null;
9 |
10 | ///
11 | /// Clean up any resources being used.
12 | ///
13 | /// true if managed resources should be disposed; otherwise, false.
14 | protected override void Dispose(bool disposing)
15 | {
16 | if (disposing && (components != null))
17 | {
18 | components.Dispose();
19 | }
20 | base.Dispose(disposing);
21 | }
22 |
23 | #region Windows Form Designer generated code
24 |
25 | ///
26 | /// Required method for Designer support - do not modify
27 | /// the contents of this method with the code editor.
28 | ///
29 | private void InitializeComponent()
30 | {
31 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmMain));
32 | this.tabControl1 = new System.Windows.Forms.TabControl();
33 | this.tabPage1 = new System.Windows.Forms.TabPage();
34 | this.label1 = new System.Windows.Forms.Label();
35 | this.btnWaitForFiles = new System.Windows.Forms.Button();
36 | this.txtPort = new System.Windows.Forms.TextBox();
37 | this.listViewReceiver = new System.Windows.Forms.ListView();
38 | this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
39 | this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
40 | this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
41 | this.tabPage2 = new System.Windows.Forms.TabPage();
42 | this.btnSendFiles = new System.Windows.Forms.Button();
43 | this.listViewSender = new System.Windows.Forms.ListView();
44 | this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
45 | this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
46 | this.columnHeader6 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
47 | this.label3 = new System.Windows.Forms.Label();
48 | this.txtIpAddress = new System.Windows.Forms.TextBox();
49 | this.label2 = new System.Windows.Forms.Label();
50 | this.txtPortConnect = new System.Windows.Forms.TextBox();
51 | this.tabPage3 = new System.Windows.Forms.TabPage();
52 | this.label5 = new System.Windows.Forms.Label();
53 | this.label4 = new System.Windows.Forms.Label();
54 | this.pictureBox1 = new System.Windows.Forms.PictureBox();
55 | this.columnHeader7 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
56 | this.columnHeader8 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
57 | this.tabControl1.SuspendLayout();
58 | this.tabPage1.SuspendLayout();
59 | this.tabPage2.SuspendLayout();
60 | this.tabPage3.SuspendLayout();
61 | ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
62 | this.SuspendLayout();
63 | //
64 | // tabControl1
65 | //
66 | this.tabControl1.Controls.Add(this.tabPage1);
67 | this.tabControl1.Controls.Add(this.tabPage2);
68 | this.tabControl1.Controls.Add(this.tabPage3);
69 | this.tabControl1.Cursor = System.Windows.Forms.Cursors.Hand;
70 | this.tabControl1.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(162)));
71 | this.tabControl1.Location = new System.Drawing.Point(7, 7);
72 | this.tabControl1.Name = "tabControl1";
73 | this.tabControl1.SelectedIndex = 0;
74 | this.tabControl1.Size = new System.Drawing.Size(618, 509);
75 | this.tabControl1.TabIndex = 10;
76 | //
77 | // tabPage1
78 | //
79 | this.tabPage1.Controls.Add(this.label1);
80 | this.tabPage1.Controls.Add(this.btnWaitForFiles);
81 | this.tabPage1.Controls.Add(this.txtPort);
82 | this.tabPage1.Controls.Add(this.listViewReceiver);
83 | this.tabPage1.Cursor = System.Windows.Forms.Cursors.Hand;
84 | this.tabPage1.Location = new System.Drawing.Point(4, 27);
85 | this.tabPage1.Name = "tabPage1";
86 | this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
87 | this.tabPage1.Size = new System.Drawing.Size(610, 478);
88 | this.tabPage1.TabIndex = 0;
89 | this.tabPage1.Text = "Receive File";
90 | this.tabPage1.UseVisualStyleBackColor = true;
91 | //
92 | // label1
93 | //
94 | this.label1.AutoSize = true;
95 | this.label1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
96 | this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 12.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(162)));
97 | this.label1.Location = new System.Drawing.Point(8, 6);
98 | this.label1.Name = "label1";
99 | this.label1.Size = new System.Drawing.Size(52, 22);
100 | this.label1.TabIndex = 12;
101 | this.label1.Text = "Port :";
102 | //
103 | // btnWaitForFiles
104 | //
105 | this.btnWaitForFiles.Cursor = System.Windows.Forms.Cursors.Hand;
106 | this.btnWaitForFiles.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(162)));
107 | this.btnWaitForFiles.Location = new System.Drawing.Point(461, 4);
108 | this.btnWaitForFiles.Name = "btnWaitForFiles";
109 | this.btnWaitForFiles.Size = new System.Drawing.Size(143, 27);
110 | this.btnWaitForFiles.TabIndex = 11;
111 | this.btnWaitForFiles.Text = "Wait For Files";
112 | this.btnWaitForFiles.UseVisualStyleBackColor = true;
113 | this.btnWaitForFiles.Click += new System.EventHandler(this.btnWaitForFiles_Click);
114 | //
115 | // txtPort
116 | //
117 | this.txtPort.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(162)));
118 | this.txtPort.Location = new System.Drawing.Point(66, 6);
119 | this.txtPort.Name = "txtPort";
120 | this.txtPort.Size = new System.Drawing.Size(389, 24);
121 | this.txtPort.TabIndex = 10;
122 | this.txtPort.Text = "1453";
123 | this.txtPort.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
124 | //
125 | // listViewReceiver
126 | //
127 | this.listViewReceiver.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
128 | this.columnHeader1,
129 | this.columnHeader2,
130 | this.columnHeader3,
131 | this.columnHeader8});
132 | this.listViewReceiver.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(162)));
133 | this.listViewReceiver.GridLines = true;
134 | this.listViewReceiver.HideSelection = false;
135 | this.listViewReceiver.Location = new System.Drawing.Point(6, 36);
136 | this.listViewReceiver.Name = "listViewReceiver";
137 | this.listViewReceiver.Size = new System.Drawing.Size(598, 436);
138 | this.listViewReceiver.TabIndex = 9;
139 | this.listViewReceiver.UseCompatibleStateImageBehavior = false;
140 | this.listViewReceiver.View = System.Windows.Forms.View.Details;
141 | //
142 | // columnHeader1
143 | //
144 | this.columnHeader1.Text = "File Name";
145 | this.columnHeader1.Width = 200;
146 | //
147 | // columnHeader2
148 | //
149 | this.columnHeader2.Text = "File Size";
150 | this.columnHeader2.Width = 120;
151 | //
152 | // columnHeader3
153 | //
154 | this.columnHeader3.Text = "Status";
155 | this.columnHeader3.Width = 130;
156 | //
157 | // tabPage2
158 | //
159 | this.tabPage2.Controls.Add(this.btnSendFiles);
160 | this.tabPage2.Controls.Add(this.listViewSender);
161 | this.tabPage2.Controls.Add(this.label3);
162 | this.tabPage2.Controls.Add(this.txtIpAddress);
163 | this.tabPage2.Controls.Add(this.label2);
164 | this.tabPage2.Controls.Add(this.txtPortConnect);
165 | this.tabPage2.Cursor = System.Windows.Forms.Cursors.Hand;
166 | this.tabPage2.Location = new System.Drawing.Point(4, 27);
167 | this.tabPage2.Name = "tabPage2";
168 | this.tabPage2.Padding = new System.Windows.Forms.Padding(3);
169 | this.tabPage2.Size = new System.Drawing.Size(610, 478);
170 | this.tabPage2.TabIndex = 1;
171 | this.tabPage2.Text = "Send File";
172 | this.tabPage2.UseVisualStyleBackColor = true;
173 | //
174 | // btnSendFiles
175 | //
176 | this.btnSendFiles.Location = new System.Drawing.Point(9, 446);
177 | this.btnSendFiles.Name = "btnSendFiles";
178 | this.btnSendFiles.Size = new System.Drawing.Size(595, 26);
179 | this.btnSendFiles.TabIndex = 18;
180 | this.btnSendFiles.Text = "Send Files";
181 | this.btnSendFiles.UseVisualStyleBackColor = true;
182 | this.btnSendFiles.Click += new System.EventHandler(this.btnSendFiles_Click);
183 | //
184 | // listViewSender
185 | //
186 | this.listViewSender.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
187 | this.columnHeader4,
188 | this.columnHeader5,
189 | this.columnHeader6,
190 | this.columnHeader7});
191 | this.listViewSender.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(162)));
192 | this.listViewSender.GridLines = true;
193 | this.listViewSender.HideSelection = false;
194 | this.listViewSender.Location = new System.Drawing.Point(6, 36);
195 | this.listViewSender.Name = "listViewSender";
196 | this.listViewSender.Size = new System.Drawing.Size(598, 404);
197 | this.listViewSender.TabIndex = 17;
198 | this.listViewSender.UseCompatibleStateImageBehavior = false;
199 | this.listViewSender.View = System.Windows.Forms.View.Details;
200 | //
201 | // columnHeader4
202 | //
203 | this.columnHeader4.Text = "File Name";
204 | this.columnHeader4.Width = 200;
205 | //
206 | // columnHeader5
207 | //
208 | this.columnHeader5.Text = "File Size";
209 | this.columnHeader5.Width = 120;
210 | //
211 | // columnHeader6
212 | //
213 | this.columnHeader6.Text = "Status";
214 | this.columnHeader6.Width = 130;
215 | //
216 | // label3
217 | //
218 | this.label3.AutoSize = true;
219 | this.label3.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
220 | this.label3.Font = new System.Drawing.Font("Microsoft Sans Serif", 12.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(162)));
221 | this.label3.Location = new System.Drawing.Point(6, 8);
222 | this.label3.Name = "label3";
223 | this.label3.Size = new System.Drawing.Size(36, 22);
224 | this.label3.TabIndex = 16;
225 | this.label3.Text = "IP :";
226 | //
227 | // txtIpAddress
228 | //
229 | this.txtIpAddress.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(162)));
230 | this.txtIpAddress.Location = new System.Drawing.Point(48, 6);
231 | this.txtIpAddress.Name = "txtIpAddress";
232 | this.txtIpAddress.Size = new System.Drawing.Size(396, 24);
233 | this.txtIpAddress.TabIndex = 15;
234 | this.txtIpAddress.Text = "127.0.0.1";
235 | this.txtIpAddress.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
236 | //
237 | // label2
238 | //
239 | this.label2.AutoSize = true;
240 | this.label2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
241 | this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 12.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(162)));
242 | this.label2.Location = new System.Drawing.Point(450, 7);
243 | this.label2.Name = "label2";
244 | this.label2.Size = new System.Drawing.Size(52, 22);
245 | this.label2.TabIndex = 14;
246 | this.label2.Text = "Port :";
247 | //
248 | // txtPortConnect
249 | //
250 | this.txtPortConnect.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(162)));
251 | this.txtPortConnect.Location = new System.Drawing.Point(508, 7);
252 | this.txtPortConnect.Name = "txtPortConnect";
253 | this.txtPortConnect.Size = new System.Drawing.Size(96, 24);
254 | this.txtPortConnect.TabIndex = 13;
255 | this.txtPortConnect.Text = "1453";
256 | this.txtPortConnect.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
257 | //
258 | // tabPage3
259 | //
260 | this.tabPage3.Controls.Add(this.label5);
261 | this.tabPage3.Controls.Add(this.label4);
262 | this.tabPage3.Controls.Add(this.pictureBox1);
263 | this.tabPage3.Location = new System.Drawing.Point(4, 27);
264 | this.tabPage3.Name = "tabPage3";
265 | this.tabPage3.Size = new System.Drawing.Size(610, 478);
266 | this.tabPage3.TabIndex = 2;
267 | this.tabPage3.Text = "About";
268 | this.tabPage3.UseVisualStyleBackColor = true;
269 | //
270 | // label5
271 | //
272 | this.label5.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(162)));
273 | this.label5.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
274 | this.label5.Location = new System.Drawing.Point(3, 402);
275 | this.label5.Name = "label5";
276 | this.label5.Size = new System.Drawing.Size(603, 31);
277 | this.label5.TabIndex = 2;
278 | this.label5.Text = "Github Profile : @dursunkatar";
279 | this.label5.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
280 | //
281 | // label4
282 | //
283 | this.label4.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(162)));
284 | this.label4.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
285 | this.label4.Location = new System.Drawing.Point(4, 333);
286 | this.label4.Name = "label4";
287 | this.label4.Size = new System.Drawing.Size(603, 31);
288 | this.label4.TabIndex = 1;
289 | this.label4.Text = "Dursun Katar / dursun.katar@gmail.com";
290 | this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
291 | //
292 | // pictureBox1
293 | //
294 | this.pictureBox1.Image = global::TcpMultiFileTransfer.Properties.Resources.coder;
295 | this.pictureBox1.Location = new System.Drawing.Point(155, 29);
296 | this.pictureBox1.Name = "pictureBox1";
297 | this.pictureBox1.Size = new System.Drawing.Size(306, 261);
298 | this.pictureBox1.TabIndex = 0;
299 | this.pictureBox1.TabStop = false;
300 | //
301 | // columnHeader7
302 | //
303 | this.columnHeader7.Text = "Total Time";
304 | this.columnHeader7.Width = 115;
305 | //
306 | // columnHeader8
307 | //
308 | this.columnHeader8.Text = "Total Time";
309 | this.columnHeader8.Width = 115;
310 | //
311 | // FrmMain
312 | //
313 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
314 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
315 | this.ClientSize = new System.Drawing.Size(629, 523);
316 | this.Controls.Add(this.tabControl1);
317 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
318 | this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
319 | this.MaximizeBox = false;
320 | this.Name = "FrmMain";
321 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
322 | this.Text = "Multi File Transfer Tools";
323 | this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmMain_FormClosing);
324 | this.tabControl1.ResumeLayout(false);
325 | this.tabPage1.ResumeLayout(false);
326 | this.tabPage1.PerformLayout();
327 | this.tabPage2.ResumeLayout(false);
328 | this.tabPage2.PerformLayout();
329 | this.tabPage3.ResumeLayout(false);
330 | ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
331 | this.ResumeLayout(false);
332 |
333 | }
334 |
335 | #endregion
336 |
337 | private System.Windows.Forms.TabControl tabControl1;
338 | private System.Windows.Forms.TabPage tabPage1;
339 | private System.Windows.Forms.Label label1;
340 | private System.Windows.Forms.Button btnWaitForFiles;
341 | private System.Windows.Forms.TextBox txtPort;
342 | private System.Windows.Forms.ListView listViewReceiver;
343 | private System.Windows.Forms.ColumnHeader columnHeader1;
344 | private System.Windows.Forms.ColumnHeader columnHeader2;
345 | private System.Windows.Forms.ColumnHeader columnHeader3;
346 | private System.Windows.Forms.TabPage tabPage2;
347 | private System.Windows.Forms.ListView listViewSender;
348 | private System.Windows.Forms.ColumnHeader columnHeader4;
349 | private System.Windows.Forms.ColumnHeader columnHeader5;
350 | private System.Windows.Forms.ColumnHeader columnHeader6;
351 | private System.Windows.Forms.Label label3;
352 | private System.Windows.Forms.TextBox txtIpAddress;
353 | private System.Windows.Forms.Label label2;
354 | private System.Windows.Forms.TextBox txtPortConnect;
355 | private System.Windows.Forms.Button btnSendFiles;
356 | private System.Windows.Forms.TabPage tabPage3;
357 | private System.Windows.Forms.PictureBox pictureBox1;
358 | private System.Windows.Forms.Label label4;
359 | private System.Windows.Forms.Label label5;
360 | private System.Windows.Forms.ColumnHeader columnHeader7;
361 | private System.Windows.Forms.ColumnHeader columnHeader8;
362 | }
363 | }
364 |
--------------------------------------------------------------------------------
/TcpMultiFileTransfer/FrmMain.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.ComponentModel;
4 | using System.Data;
5 | using System.Drawing;
6 | using System.IO;
7 | using System.Linq;
8 | using System.Net;
9 | using System.Text;
10 | using System.Threading;
11 | using System.Threading.Tasks;
12 | using System.Windows.Forms;
13 |
14 | namespace TcpMultiFileTransfer
15 | {
16 | public partial class FrmMain : Form
17 | {
18 | public FrmMain()
19 | {
20 | InitializeComponent();
21 |
22 | init();
23 | }
24 |
25 | private void init()
26 | {
27 | CheckForIllegalCrossThreadCalls = false;
28 |
29 | Listen.AddListViewItem = addlistViewReceiverItem;
30 | Sender.AddListViewItem = addlistViewSenderItem;
31 |
32 | if (!Directory.Exists("Downloads"))
33 | {
34 | Directory.CreateDirectory("Downloads");
35 | }
36 | }
37 |
38 | private void addlistViewReceiverItem(ListViewItem lvi)
39 | {
40 | if (this.InvokeRequired)
41 | {
42 | this.Invoke((MethodInvoker)delegate ()
43 | {
44 | listViewReceiver.Items.Insert(0, lvi);
45 | });
46 | }
47 | }
48 |
49 | private void addlistViewSenderItem(ListViewItem lvi)
50 | {
51 | if (this.InvokeRequired)
52 | {
53 | this.Invoke((MethodInvoker)delegate ()
54 | {
55 | listViewSender.Items.Insert(0, lvi);
56 | });
57 | }
58 | }
59 |
60 | private void StatusStopped()
61 | {
62 | foreach (ListViewItem item in listViewReceiver.Items)
63 | {
64 | if (item.SubItems[2].Text == "Receiving...")
65 | {
66 | item.SubItems[2].Text = "Stopped";
67 | }
68 | }
69 | }
70 |
71 | private void btnWaitForFiles_Click(object sender, EventArgs e)
72 | {
73 | if (btnWaitForFiles.Text == "Wait For Files")
74 | {
75 | try
76 | {
77 | Listen.Start(int.Parse(txtPort.Text));
78 | btnWaitForFiles.Text = "Cancel Waiting";
79 | }
80 | catch (Exception ex)
81 | {
82 | MessageBox.Show(ex.Message);
83 | }
84 | }
85 | else
86 | {
87 | Listen.Stop();
88 | btnWaitForFiles.Text = "Wait For Files";
89 | StatusStopped();
90 | }
91 | }
92 |
93 | private void btnSendFiles_Click(object sender, EventArgs e)
94 | {
95 | IPAddress ipAddr = IPAddress.Parse(txtIpAddress.Text);
96 | int port = int.Parse(txtPortConnect.Text);
97 |
98 | var file = new OpenFileDialog();
99 | file.Multiselect = true;
100 | file.Title = "Select Files";
101 |
102 | if (file.ShowDialog() == DialogResult.OK)
103 | {
104 | foreach (string fileName in file.FileNames)
105 | {
106 | new Thread(() =>
107 | {
108 | Sender.Send(ipAddr, port, fileName);
109 |
110 | }).Start();
111 | }
112 | }
113 | file.Dispose();
114 | }
115 |
116 | private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)
117 | {
118 | Listen.Stop();
119 | Sender.Close();
120 | }
121 | }
122 | }
123 |
--------------------------------------------------------------------------------
/TcpMultiFileTransfer/Listen.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Diagnostics;
4 | using System.Linq;
5 | using System.Net;
6 | using System.Net.Sockets;
7 | using System.Text;
8 | using System.Threading;
9 | using System.Threading.Tasks;
10 | using System.Windows.Forms;
11 |
12 | namespace TcpMultiFileTransfer
13 | {
14 | public class Listen
15 | {
16 | private static Socket socket;
17 | private static bool IsStop;
18 | public delegate void ListViewItemEvent(ListViewItem listViewItem);
19 | public static ListViewItemEvent AddListViewItem { get; set; }
20 |
21 | public static void Start(int port)
22 | {
23 | if (socket != null)
24 | return;
25 |
26 | try
27 | {
28 | socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
29 | socket.Bind(new IPEndPoint(IPAddress.Any, port));
30 | socket.Listen(100);
31 | }
32 | catch (Exception ex)
33 | {
34 | Stop();
35 | throw ex;
36 | }
37 |
38 | IsStop = false;
39 |
40 | new Thread(() =>
41 | {
42 | while (true)
43 | {
44 | try
45 | {
46 | var client = socket.Accept();
47 | new Thread(() =>
48 | {
49 | var fileInfo = ReceiverEngine.GetFileInfo(client);
50 | var lvi = listViewItem(fileInfo);
51 | AddListViewItem(lvi);
52 |
53 | var stopwatch = new Stopwatch();
54 | stopwatch.Start();
55 |
56 | fileInfo.LoadData();
57 |
58 | if (!IsStop)
59 | {
60 | stopwatch.Stop();
61 | lvi.SubItems[2].Text = "OK";
62 | lvi.SubItems[3].Text = totalTime(stopwatch);
63 | }
64 |
65 |
66 | }).Start();
67 | }
68 | catch (Exception ex)
69 | {
70 | if (!IsStop)
71 | MessageBox.Show(ex.Message);
72 | break;
73 | }
74 | }
75 | }).Start();
76 | }
77 |
78 | private static ListViewItem listViewItem(ReceiveFileInfo fileInfo)
79 | {
80 | var lvi = new ListViewItem();
81 | lvi.Text = fileInfo.FileName;
82 | string strSize = fileInfo.FileSize + " KB";
83 | if (fileInfo.FileSize > 1024)
84 | {
85 | strSize = String.Format("{0:0.##}", fileInfo.FileSize / 1024.0) + " MB";
86 | }
87 | lvi.SubItems.Add(strSize);
88 | lvi.SubItems.Add("Receiving...");
89 | lvi.SubItems.Add("");
90 | return lvi;
91 | }
92 |
93 | private static string totalTime(Stopwatch stopwatch)
94 | {
95 | double totalT = stopwatch.ElapsedMilliseconds / 1000.0;
96 | return totalT > 60 ? String.Format("{0:0.##}", totalT / 60.0) + " min" : String.Format("{0:0.##}", totalT) + " sec";
97 | }
98 |
99 | public static void Stop()
100 | {
101 | IsStop = true;
102 | if (socket != null)
103 | {
104 | if (socket.Connected)
105 | socket.Disconnect(false);
106 |
107 | socket.Close();
108 | socket.Dispose();
109 | socket = null;
110 | }
111 | }
112 | }
113 | }
114 |
--------------------------------------------------------------------------------
/TcpMultiFileTransfer/Program.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Threading.Tasks;
5 | using System.Windows.Forms;
6 |
7 | namespace TcpMultiFileTransfer
8 | {
9 | static class Program
10 | {
11 | ///
12 | /// The main entry point for the application.
13 | ///
14 | [STAThread]
15 | static void Main()
16 | {
17 | Application.EnableVisualStyles();
18 | Application.SetCompatibleTextRenderingDefault(false);
19 | Application.Run(new FrmMain());
20 | }
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/TcpMultiFileTransfer/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // General Information about an assembly is controlled through the following
6 | // set of attributes. Change these attribute values to modify the information
7 | // associated with an assembly.
8 | [assembly: AssemblyTitle("Dursun Katar")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("github.com/dursunkatar")]
12 | [assembly: AssemblyProduct("Multi File Transfer Tools")]
13 | [assembly: AssemblyCopyright("Copyright © 2019")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // Setting ComVisible to false makes the types in this assembly not visible
18 | // to COM components. If you need to access a type in this assembly from
19 | // COM, set the ComVisible attribute to true on that type.
20 | [assembly: ComVisible(false)]
21 |
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM
23 | [assembly: Guid("9a880fdb-507f-41c4-993e-74b481bd7f72")]
24 |
25 | // Version information for an assembly consists of the following four values:
26 | //
27 | // Major Version
28 | // Minor Version
29 | // Build Number
30 | // Revision
31 | //
32 | // You can specify all the values or you can default the Build and Revision Numbers
33 | // by using the '*' as shown below:
34 | // [assembly: AssemblyVersion("1.0.*")]
35 | [assembly: AssemblyVersion("1.0.0.0")]
36 | [assembly: AssemblyFileVersion("1.0.0.0")]
37 |
--------------------------------------------------------------------------------
/TcpMultiFileTransfer/Properties/Resources.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | // Runtime Version:4.0.30319.42000
5 | //
6 | // Changes to this file may cause incorrect behavior and will be lost if
7 | // the code is regenerated.
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 | namespace TcpMultiFileTransfer.Properties {
12 | using System;
13 |
14 |
15 | ///
16 | /// A strongly-typed resource class, for looking up localized strings, etc.
17 | ///
18 | // This class was auto-generated by the StronglyTypedResourceBuilder
19 | // class via a tool like ResGen or Visual Studio.
20 | // To add or remove a member, edit your .ResX file then rerun ResGen
21 | // with the /str option, or rebuild your VS project.
22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")]
23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
25 | internal class Resources {
26 |
27 | private static global::System.Resources.ResourceManager resourceMan;
28 |
29 | private static global::System.Globalization.CultureInfo resourceCulture;
30 |
31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
32 | internal Resources() {
33 | }
34 |
35 | ///
36 | /// Returns the cached ResourceManager instance used by this class.
37 | ///
38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
39 | internal static global::System.Resources.ResourceManager ResourceManager {
40 | get {
41 | if (object.ReferenceEquals(resourceMan, null)) {
42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("TcpMultiFileTransfer.Properties.Resources", typeof(Resources).Assembly);
43 | resourceMan = temp;
44 | }
45 | return resourceMan;
46 | }
47 | }
48 |
49 | ///
50 | /// Overrides the current thread's CurrentUICulture property for all
51 | /// resource lookups using this strongly typed resource class.
52 | ///
53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
54 | internal static global::System.Globalization.CultureInfo Culture {
55 | get {
56 | return resourceCulture;
57 | }
58 | set {
59 | resourceCulture = value;
60 | }
61 | }
62 |
63 | ///
64 | /// Looks up a localized resource of type System.Drawing.Bitmap.
65 | ///
66 | internal static System.Drawing.Bitmap coder {
67 | get {
68 | object obj = ResourceManager.GetObject("coder", resourceCulture);
69 | return ((System.Drawing.Bitmap)(obj));
70 | }
71 | }
72 | }
73 | }
74 |
--------------------------------------------------------------------------------
/TcpMultiFileTransfer/Properties/Resources.resx:
--------------------------------------------------------------------------------
1 |
2 |
3 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 | text/microsoft-resx
110 |
111 |
112 | 2.0
113 |
114 |
115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
116 |
117 |
118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
119 |
120 |
121 |
122 | ..\Resources\coder.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
123 |
124 |
--------------------------------------------------------------------------------
/TcpMultiFileTransfer/Properties/Settings.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | // Runtime Version:4.0.30319.42000
5 | //
6 | // Changes to this file may cause incorrect behavior and will be lost if
7 | // the code is regenerated.
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 | namespace TcpMultiFileTransfer.Properties
12 | {
13 |
14 |
15 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
16 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
17 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
18 | {
19 |
20 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
21 |
22 | public static Settings Default
23 | {
24 | get
25 | {
26 | return defaultInstance;
27 | }
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/TcpMultiFileTransfer/Properties/Settings.settings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/TcpMultiFileTransfer/ReceiveFileInfo.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 |
7 | namespace TcpMultiFileTransfer
8 | {
9 | public class ReceiveFileInfo
10 | {
11 | public string FileName { get; set; }
12 | public double FileSize { get; set; }
13 | private Receiver receiver;
14 |
15 | public ReceiveFileInfo(Receiver _receiver)
16 | {
17 | receiver = _receiver;
18 | }
19 |
20 | public void LoadData()
21 | {
22 | receiver.LoadFile();
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/TcpMultiFileTransfer/Receiver.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.IO;
4 | using System.Linq;
5 | using System.Net.Sockets;
6 | using System.Text;
7 | using System.Threading.Tasks;
8 |
9 | namespace TcpMultiFileTransfer
10 | {
11 | public class Receiver
12 | {
13 | private readonly Socket socket;
14 | private readonly string fileName;
15 |
16 | public Receiver(Socket socket, string fileName)
17 | {
18 | this.socket = socket;
19 | this.fileName = fileName;
20 | }
21 |
22 | public void LoadFile()
23 | {
24 | int bytesRead = 0;
25 | byte[] buffer = new byte[332800]; // 325 KB
26 | using (var networkStream = new NetworkStream(socket))
27 | using (var binaryReader = new BinaryReader(networkStream))
28 | using (Stream writer = File.OpenWrite("Downloads\\" + fileName))
29 | {
30 | while (networkStream.CanRead && (bytesRead = binaryReader.Read(buffer, 0, buffer.Length)) > 0)
31 | {
32 | writer.Write(buffer, 0, bytesRead);
33 | writer.Flush();
34 | }
35 | }
36 | Dispose();
37 | }
38 |
39 | private void Dispose()
40 | {
41 | socket.Disconnect(false);
42 | socket.Close();
43 | socket.Dispose();
44 | }
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/TcpMultiFileTransfer/ReceiverEngine.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Net.Sockets;
5 | using System.Text;
6 | using System.Threading.Tasks;
7 |
8 | namespace TcpMultiFileTransfer
9 | {
10 | public class ReceiverEngine
11 | {
12 | private static readonly byte[] RESUME = new byte[] { 0 };
13 |
14 | public static ReceiveFileInfo GetFileInfo(Socket socket)
15 | {
16 | byte[] buffer = new byte[512];
17 | int bytesRead = socket.Receive(buffer, SocketFlags.None);
18 | var fileInfo = Encoding.UTF8.GetString(buffer, 0, bytesRead).Split('|');
19 | socket.Send(RESUME);
20 | return new ReceiveFileInfo(new Receiver(socket, fileInfo[0]))
21 | {
22 | FileName = fileInfo[0],
23 | FileSize = Double.Parse(String.Format("{0:0.##}", long.Parse(fileInfo[1]) / 1024.0))
24 | };
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/TcpMultiFileTransfer/Resources/coder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dursunkatar/TcpMultiFileTransfer/0fdf3871ff8f1647d46f60c18ff7dbe8226011f3/TcpMultiFileTransfer/Resources/coder.png
--------------------------------------------------------------------------------
/TcpMultiFileTransfer/Sender.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Diagnostics;
4 | using System.IO;
5 | using System.Linq;
6 | using System.Net;
7 | using System.Net.Sockets;
8 | using System.Text;
9 | using System.Threading.Tasks;
10 | using System.Windows.Forms;
11 |
12 | namespace TcpMultiFileTransfer
13 | {
14 | public class Sender
15 | {
16 | private static readonly byte[] WAIT = new byte[] { 0 };
17 | public delegate void ListViewItemEvent(ListViewItem listViewItem);
18 | public static ListViewItemEvent AddListViewItem { get; set; }
19 | private static readonly List sockets = new List();
20 |
21 | public static void Send(IPAddress iPAddress, int port, string filePath)
22 | {
23 | var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
24 | sockets.Add(socket);
25 | var localEndPoint = new IPEndPoint(iPAddress, port);
26 | try
27 | {
28 | socket.Connect(localEndPoint);
29 | }
30 | catch (Exception ex)
31 | {
32 | MessageBox.Show(ex.Message);
33 | return;
34 | }
35 |
36 | var fileInfo = new FileInfo(filePath);
37 | byte[] bytesFileInfo = Encoding.UTF8.GetBytes(fileInfo.Name + "|" + fileInfo.Length);
38 |
39 | var lvi = listViewItem(fileInfo);
40 | AddListViewItem(lvi);
41 |
42 | socket.Send(bytesFileInfo);
43 | socket.Receive(WAIT);
44 |
45 | var stopwatch = new Stopwatch();
46 | stopwatch.Start();
47 |
48 | int bytesRead;
49 | byte[] buffer = new byte[332800]; // 325 KB
50 | try
51 | {
52 | using (var networkStream = new NetworkStream(socket))
53 | using (var binaryWriter = new BinaryWriter(networkStream))
54 | using (var read = File.OpenRead(filePath))
55 | {
56 | while ((bytesRead = read.Read(buffer, 0, buffer.Length)) > 0)
57 | {
58 | binaryWriter.Write(buffer, 0, bytesRead);
59 | binaryWriter.Flush();
60 | }
61 |
62 | stopwatch.Stop();
63 | lvi.SubItems[3].Text = totalTime(stopwatch);
64 | lvi.SubItems[2].Text = "OK";
65 | }
66 | }
67 | catch
68 | {
69 | lvi.SubItems[2].Text = "Failed!";
70 | }
71 | finally
72 | {
73 | try
74 | {
75 | if (socket.Connected)
76 | socket.Disconnect(false);
77 | socket.Close();
78 | socket.Dispose();
79 | socket = null;
80 | }
81 | catch { }
82 | }
83 | }
84 |
85 | private static string totalTime(Stopwatch stopwatch)
86 | {
87 | double totalT = stopwatch.ElapsedMilliseconds / 1000.0;
88 | return totalT > 60 ? String.Format("{0:0.##}", totalT / 60.0) + " min" : String.Format("{0:0.##}", totalT) + " sec";
89 | }
90 |
91 | private static ListViewItem listViewItem(FileInfo fileInfo)
92 | {
93 | var lvi = new ListViewItem();
94 | lvi.Text = fileInfo.Name;
95 | string strSize = String.Format("{0:0.##}", fileInfo.Length / 1024.0) + " KB";
96 | if (fileInfo.Length / 1024.0 > 1024)
97 | {
98 | strSize = String.Format("{0:0.##}", fileInfo.Length / 1024.0 / 1024.0) + " MB";
99 | }
100 | lvi.SubItems.Add(strSize);
101 | lvi.SubItems.Add("Sending...");
102 | lvi.SubItems.Add("");
103 | return lvi;
104 | }
105 |
106 | public static void Close()
107 | {
108 | foreach (Socket item in sockets)
109 | {
110 | if (item != null)
111 | {
112 | try
113 | {
114 | if (item.Connected)
115 | item.Disconnect(false);
116 |
117 | item.Close();
118 | item.Dispose();
119 | }
120 | catch { }
121 | }
122 | }
123 | }
124 | }
125 | }
126 |
--------------------------------------------------------------------------------
/TcpMultiFileTransfer/TcpMultiFileTransfer.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | AnyCPU
7 | {9A880FDB-507F-41C4-993E-74B481BD7F72}
8 | WinExe
9 | TcpMultiFileTransfer
10 | TcpMultiFileTransfer
11 | v4.6.1
12 | 512
13 | true
14 | true
15 |
16 |
17 | AnyCPU
18 | true
19 | full
20 | false
21 | bin\Debug\
22 | DEBUG;TRACE
23 | prompt
24 | 4
25 |
26 |
27 | AnyCPU
28 | pdbonly
29 | true
30 | bin\Release\
31 | TRACE
32 | prompt
33 | 4
34 |
35 |
36 | filetransfer.ico
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 | Form
55 |
56 |
57 | FrmMain.cs
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 | FrmMain.cs
67 |
68 |
69 | ResXFileCodeGenerator
70 | Resources.Designer.cs
71 | Designer
72 |
73 |
74 | True
75 | Resources.resx
76 | True
77 |
78 |
79 | SettingsSingleFileGenerator
80 | Settings.Designer.cs
81 |
82 |
83 | True
84 | Settings.settings
85 | True
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
--------------------------------------------------------------------------------
/TcpMultiFileTransfer/filetransfer.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dursunkatar/TcpMultiFileTransfer/0fdf3871ff8f1647d46f60c18ff7dbe8226011f3/TcpMultiFileTransfer/filetransfer.ico
--------------------------------------------------------------------------------
/receivescrn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dursunkatar/TcpMultiFileTransfer/0fdf3871ff8f1647d46f60c18ff7dbe8226011f3/receivescrn.png
--------------------------------------------------------------------------------
/sendscrn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dursunkatar/TcpMultiFileTransfer/0fdf3871ff8f1647d46f60c18ff7dbe8226011f3/sendscrn.png
--------------------------------------------------------------------------------