using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace FuckTrans
{
public class SocketServer
{
private Dictionary<int, Socket> _clientList = new Dictionary<int, Socket>();
public delegate void ServerEventDele(int clientID);
public delegate void ReceivedDele(int clientID, byte[] buffer);
//public ServerEventDele OnClientOnLine;
//public ServerEventDele OnClientOffLine;
public ReceivedDele OnReceivedBuffer;
private string _errorMessage;
/// <summary>
/// error message
/// </summary>
public string ErrorMessage
{
get { return _errorMessage; }
}
/// <summary>
/// init
/// </summary>
/// <param name="port">port</param>
public bool Init(int port)
{
try
{
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, port);
serverSocket.Bind(endPoint);
serverSocket.Listen(3);
Thread threadListen = new Thread(new ParameterizedThreadStart(ListenSocket));
threadListen.IsBackground = true;
threadListen.Start(serverSocket);
return true;
}
catch (Exception ex)
{
_errorMessage = ex.ToString();
return false;
}
}
private void ListenSocket(object server)
{
Socket serverSocket = (Socket)server;
while (true)
{
Socket clientSocket = serverSocket.Accept();
Thread threadGetMessage = new Thread(new ParameterizedThreadStart(GetMessage));
threadGetMessage.SetApartmentState(ApartmentState.STA);
threadGetMessage.IsBackground = true;
threadGetMessage.Start(clientSocket);
lock (_clientList)
{
if (!_clientList.ContainsValue(clientSocket))
{
_clientList.Add(clientSocket.Handle.ToInt32(), clientSocket);
//OnClientOnLine(clientSocket.Handle.ToInt32());
}
}
}
}
private void GetMessage(object client)
{
Socket clientSocket = (Socket)client;
int clientId = clientSocket.Handle.ToInt32();
try
{
while (true)
{
byte[] buffer = new byte[1024 * 8];
int length = clientSocket.Receive(buffer);
if (length > 0)
{
Array.Resize<byte>(ref buffer, length);
byte b = buffer[buffer.Length - 1];
if (b != 0xFA && b != 0xFB && b != 0xFF)
{
}
OnReceivedBuffer(clientId, buffer);
}
}
}
catch(Exception ex)
{
lock (_clientList)
{
if (_clientList.ContainsValue(clientSocket))
{
_clientList.Remove(clientSocket.Handle.ToInt32());
//OnClientOffLine(clientSocket.Handle.ToInt32());
}
Thread.CurrentThread.Abort();
}
}
}
/// <summary>
/// sent to client
/// </summary>
/// <param name="clientId">client id</param>
/// <param name="buffer">buffer</param>
/// <returns></returns>
public bool SendMessage(int clientId, byte[] buffer)
{
lock (_clientList)
{
try
{
_clientList[clientId].Send(buffer);
return true;
}
catch (Exception ex)
{
_errorMessage = ex.ToString();
return false;
}
}
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;
namespace FuckTrans
{
public class SocketClient
{
private Socket _clientSocket;
public delegate void ClientEventDele(byte[] buffer);
public ClientEventDele OnReceivedBuffer;
//public ClientEventDele OnConnectionExcept;
private string _errorMessage;
/// <summary>
/// error message
/// </summary>
public string ErrorMessage
{
get { return _errorMessage; }
}
public bool Init(string ip, int port)
{
try
{
IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(ip), port);
_clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_clientSocket.Connect(endPoint);
Thread threadGetMessage = new Thread(new ThreadStart(GetMessage));
threadGetMessage.IsBackground = true;
threadGetMessage.Start();
return true;
}
catch (Exception ex)
{
_errorMessage = ex.ToString();
return false;
}
}
private void GetMessage()
{
try
{
while (true)
{
byte[] buffer = new byte[1024 * 8];
int length = _clientSocket.Receive(buffer);
if (length > 0)
{
Array.Resize<byte>(ref buffer, length);
OnReceivedBuffer(buffer);
}
}
}
catch
{
//OnConnectionExcept(null);
Thread.CurrentThread.Abort();
}
}
public bool SendMessage(byte[] buffer)
{
try
{
_clientSocket.Send(buffer);
return true;
}
catch (Exception ex)
{
_errorMessage = ex.ToString();
return false;
}
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Windows.Forms;
namespace FuckTrans
{
public class JustTransServer
{
public delegate void ReceiveProgressDele(int i);
public ReceiveProgressDele ReceiveProgress;
private SocketServer server;
private FileStream write;
private string fileName;
private long fileSize;
private long writeCount;
public void Init(int port)
{
server = new SocketServer();
server.OnReceivedBuffer = OnReceived;
server.Init(port);
}
private void OnReceived(int clientID, byte[] buffer)
{
if (write != null)
{
write.Write(buffer, 0, buffer.Length);
writeCount += buffer.Length;
int process = Convert.ToInt32((float)writeCount / (float)fileSize * 100f);
ReceiveProgress(process);
if (writeCount >= fileSize)
{
write.Close();
MessageBox.Show(string.Format("Receive OK\r\nfile size {0}\r\nreceive size {1}", fileSize, writeCount));
write = null;
fileName = null;
fileSize = 0;
writeCount = 0;
ReceiveProgress(0);
}
}
else
{
string mes = Encoding.Default.GetString(buffer);
if (mes != null && mes.Contains("|"))
{
fileName = mes.Split('|')[0];
fileSize = long.Parse(mes.Split('|')[1]);
if (StartWrite())
server.SendMessage(clientID, new byte[] { 0xff, 0xff });
}
}
}
private bool StartWrite()
{
string info = string.Format("Do you wanna receive file?\r\nfile name {0}\r\nfile size {1}", fileName, fileSize);
if (MessageBox.Show(info, "receive file", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes)
{
return false;
}
SaveFileDialog sfd = new SaveFileDialog();
sfd.FileName = fileName;
if (sfd.ShowDialog() == DialogResult.Cancel)
{
return false;
}
string filePath = sfd.FileName;
DriveInfo di = new DriveInfo(filePath.Substring(0, 1));
if (di.TotalFreeSpace < fileSize)
{
MessageBox.Show("not enough space");
return false;
}
write = new FileStream(filePath , FileMode.Create, FileAccess.Write);
return true;
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Threading;
using System.Windows.Forms;
namespace FuckTrans
{
public class JustTransClient
{
public delegate void SendProgressDele(int i);
public SendProgressDele SendProgress;
private SocketClient client;
private FileStream read;
private long fileSize;
private long readCount;
public void Init(string ip, int port, string filePath)
{
client = new SocketClient();
client.OnReceivedBuffer = Receive;
client.Init(ip, port);
read = new FileStream(filePath, FileMode.Open, FileAccess.Read);
fileSize = read.Length;
string[] tmp = filePath.Split(Convert.ToChar("\\"));
string fileName = tmp[tmp.Length - 1];
string info = string.Format("{0}|{1}", fileName, fileSize.ToString());
byte[] buffer = Encoding.Default.GetBytes(info);
client.SendMessage(buffer);
}
private void Receive(byte[] buffer)
{
if (buffer.Length == 2 && buffer[0] == 0xff && buffer[1] == 0xff)
{
Thread th = new Thread(new ThreadStart(ReadAndSend));
th.IsBackground = true;
th.Start();
}
}
private void ReadAndSend()
{
try
{
if (read.CanRead)
{
int size = 1024 * 8;
while(true)
{
byte[] buffer = new byte[size];
int count = read.Read(buffer, 0, buffer.Length);
if (count == 0)
break;
if (count < buffer.Length)
Array.Resize<byte>(ref buffer, count);
client.SendMessage(buffer);
readCount += count;
int progress = Convert.ToInt32((float)readCount / (float)fileSize * 100f);
SendProgress(progress);
}
read.Close();
MessageBox.Show(string.Format("Send OK\r\nfile size {0}\r\nsend size {1}", fileSize, readCount));
SendProgress(0);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
read.Close();
}
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace FuckTrans
{
public partial class FuckTransForm : Form
{
public FuckTransForm()
{
InitializeComponent();
}
private void FuckTransForm_Load(object sender, EventArgs e)
{
openFileDialog1.Filter = "All Files|*.*";
openFileDialog1.FileName = "";
}
private void button1_Click(object sender, EventArgs e)
{
openFileDialog1.ShowDialog();
textBox1.Text = openFileDialog1.FileName;
}
private void button2_Click(object sender, EventArgs e)
{
JustTransClient client = new JustTransClient();
client.Init(textBox2.Text, 7890, textBox1.Text);
client.SendProgress = UpdateProgress;
}
private void button3_Click(object sender, EventArgs e)
{
JustTransServer server = new JustTransServer();
server.Init(Convert.ToInt32(textBox3.Text));
server.ReceiveProgress = UpdateProgress;
button3.Enabled = false;
button1.Enabled = false;
button2.Enabled = false;
}
private delegate void UpdateProcessDele(int i);
private void UpdateProgress(int i)
{
if (progressBar1.InvokeRequired)
{
progressBar1.BeginInvoke(new UpdateProcessDele(UpdateProgress), new object[] { i });
}
else
{
progressBar1.Value = i;
}
}
}
}