-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathFileTransfer.cs
108 lines (105 loc) · 4.22 KB
/
FileTransfer.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Net.NetworkInformation;
using System.Management;
using System.Threading;
using System.Windows;
using System.Timers;
using SpecialEnumeration;
namespace UChat
{
/// <summary>
/// 文件传输。
/// </summary>
public static class FileTransfer
{
/// <summary>
/// 发起文件传输请求,等待对面确认。
/// </summary>
/// <param name="fileName"></param>
/// <param name="fileSize"></param>
public static void FileTransferRequestSender(string fileName, long fileSize)
{
/// 文件传输请求信息由以下部分组成:
/// 【文件传输请求字 FR】+【本用户17位UID】+【12位文件大小(不足左边补0)】+【文件名】
string carrier = "FR" + CommonFoundations.HostUID + fileSize.ToString().PadLeft(12, '0') + fileName;
IPAddress iPAddress = IPAddress.Parse(CommonFoundations.FileTransferTempData.FRDestinationIP);
UDP uDP = new UDP();
uDP.UDPMessageSender(iPAddress, carrier);
}
/// <summary>
/// 发送文件传输请求回复。
/// </summary>
/// <param name="AcceptStatus">文件传输请求确认:使用 AcceptStatus 结构体。</param>
/// <param name="ip">目的地 IP</param>
public static void FileTransferAnswerSender(string AcceptStatus, string ip)
{
/// 文件传输请求信息由以下部分组成:
/// 【文件传输请求字 FR】+【接受状态字】
string carrier = "FA" + AcceptStatus;
//MessageBox.Show(carrier);
//MessageBox.Show(carrier);
IPAddress iPAddress = IPAddress.Parse(ip);
UDP uDP = new UDP();
uDP.UDPMessageSender(iPAddress, carrier);
}
/// <summary>
/// 处理接收到的文件传输请求。涉及跨线程。
/// </summary>
/// <param name="message"></param>
public static void RequestProcessor(string message)
{
if (message.Substring(0, 2) == "FR")//代表是文件传输请求
{
if (CommonFoundations.FileTransferTempData.FlieTransferAcceptLock == true)//本机锁开,自动拒绝
{
//MessageBox.Show("自动拒绝对面");
string ip = FormMain.formMain.UIDtoIP(message.Substring(2, 17));
FileTransferAnswerSender(AcceptStatus.RefuseByLock, ip);
}
else
{
CommonFoundations.FileTransferTempData.FlieTransferAcceptLock = true;//开启文件锁
string uid = message.Substring(2, 17);
string fileSize = message.Substring(19, 12);
string fileName = message.Substring(31);
FormMain.formMain.ShowFileTransferConfirm(uid, fileName, fileSize);
}
}
if (message.Substring(0, 2) == "FA")//代表是文件传输回复
{
switch (message.Substring(2))
{
case "Accept"://接受文件
FormMain.formMain.TimerPercent();
FormMain.formMain.backgroundWorkerFileSender.RunWorkerAsync();
//FormMain.formMain.StartFileSend();
break;
case "RefuseByUser"://对方拒绝
//MessageBox.Show("被对方拒绝");
FormMain.formMain.RefuseRemind();
break;
case "RefuseByLock"://自动拒绝
//MessageBox.Show("被自动拒绝");
FormMain.formMain.BusyRemind();
break;
default:
break;
}
}
}
}
}