You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
1.4 KiB
86 lines
1.4 KiB
3 years ago
|
using System;
|
||
|
using System.Collections.Generic;
|
||
|
using System.Linq;
|
||
|
using System.Text;
|
||
|
using System.Threading.Tasks;
|
||
|
using System.Net;
|
||
|
using System.Net.Sockets;
|
||
|
|
||
|
namespace KnockKnock.Lib
|
||
|
{
|
||
|
internal class Connection
|
||
|
{
|
||
|
public delegate void SocketReceivedEvent(Connection sender, byte[] data);
|
||
|
public delegate void SocketEvent(Connection sender);
|
||
|
|
||
|
public SocketReceivedEvent Received;
|
||
|
public SocketEvent Closed;
|
||
|
|
||
|
const int BUFFER_SIZE = 1024;
|
||
|
|
||
|
Socket socket;
|
||
|
byte[] buffer = new byte[BUFFER_SIZE];
|
||
|
|
||
|
public Connection(Socket socket)
|
||
|
{
|
||
|
this.socket = socket;
|
||
|
}
|
||
|
|
||
|
public void Open()
|
||
|
{
|
||
|
this.socket.BeginReceive(this.buffer, 0, BUFFER_SIZE, SocketFlags.None, this.SocketReceive, null);
|
||
|
}
|
||
|
|
||
|
public void Close()
|
||
|
{
|
||
|
this.socket.Close();
|
||
|
}
|
||
|
|
||
|
public void Send(byte[] data)
|
||
|
{
|
||
|
try
|
||
|
{
|
||
|
this.socket.Send(data);
|
||
|
}
|
||
|
catch
|
||
|
{
|
||
|
this.Closed(this);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
protected void SocketReceive(IAsyncResult result)
|
||
|
{
|
||
|
int read;
|
||
|
try
|
||
|
{
|
||
|
read = socket.EndReceive(result);
|
||
|
}
|
||
|
catch
|
||
|
{
|
||
|
Closed(this);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (read == 0)
|
||
|
{
|
||
|
// Connection closed
|
||
|
Closed(this);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
byte[] received = new byte[read];
|
||
|
Array.Copy(this.buffer, 0, received, 0, read);
|
||
|
Received(this, received);
|
||
|
try
|
||
|
{
|
||
|
socket.BeginReceive(this.buffer, 0, BUFFER_SIZE, SocketFlags.None, this.SocketReceive, null);
|
||
|
}
|
||
|
catch
|
||
|
{
|
||
|
Closed(this);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|