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.
85 lines
1.4 KiB
85 lines
1.4 KiB
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|