5 changed files with 158 additions and 775 deletions
@ -1,25 +0,0 @@ |
|||||
using System; |
|
||||
using System.Collections.Generic; |
|
||||
using System.Net.Sockets; |
|
||||
using System.Text; |
|
||||
|
|
||||
namespace Apewer |
|
||||
{ |
|
||||
|
|
||||
internal class TcpBuffer |
|
||||
{ |
|
||||
|
|
||||
// TCP 传输缓冲区大小。
|
|
||||
public const int Size = 8192; |
|
||||
|
|
||||
public Socket Socket; |
|
||||
public byte[] Buffer; |
|
||||
|
|
||||
public TcpBuffer() |
|
||||
{ |
|
||||
Buffer = new byte[Size]; |
|
||||
} |
|
||||
|
|
||||
} |
|
||||
|
|
||||
} |
|
@ -1,99 +0,0 @@ |
|||||
using Apewer.Network; |
|
||||
using System; |
|
||||
using System.Collections.Generic; |
|
||||
using System.IO; |
|
||||
using System.Net; |
|
||||
using System.Net.Sockets; |
|
||||
using System.Text; |
|
||||
using System.Threading; |
|
||||
|
|
||||
namespace Apewer |
|
||||
{ |
|
||||
|
|
||||
internal class TcpInstance |
|
||||
{ |
|
||||
|
|
||||
private TcpServer _parent; |
|
||||
private Socket _server; |
|
||||
private Socket _client; |
|
||||
private IPEndPoint _ep; |
|
||||
|
|
||||
private string _ip; |
|
||||
private int _port; |
|
||||
|
|
||||
private ManualResetEvent _done = new ManualResetEvent(false); |
|
||||
private int _length = 0; |
|
||||
private byte[] _data; |
|
||||
|
|
||||
public TcpInstance(TcpServer parent, Socket server, Socket client) |
|
||||
{ |
|
||||
_parent = parent; |
|
||||
_server = server; |
|
||||
_client = client; |
|
||||
_ep = (IPEndPoint)_client.RemoteEndPoint; |
|
||||
_ip = _ep.Address.ToString(); |
|
||||
_port = _ep.Port; |
|
||||
} |
|
||||
|
|
||||
public void Process() |
|
||||
{ |
|
||||
try |
|
||||
{ |
|
||||
var vm = new TcpBuffer(); |
|
||||
vm.Socket = _client; |
|
||||
vm.Socket.BeginReceive(vm.Buffer, 0, vm.Buffer.Length, SocketFlags.None, Callback, vm); |
|
||||
_done.WaitOne(); |
|
||||
} |
|
||||
catch (Exception argex) { _parent.RaiseExcepted(argex); } |
|
||||
} |
|
||||
|
|
||||
private void Callback(IAsyncResult ar) |
|
||||
{ |
|
||||
try |
|
||||
{ |
|
||||
var buffer = (TcpBuffer)ar.AsyncState; |
|
||||
if (buffer.Socket.Connected) |
|
||||
{ |
|
||||
_length = buffer.Socket.EndReceive(ar); |
|
||||
if (_length > 0) |
|
||||
{ |
|
||||
_data = new byte[_length]; |
|
||||
Array.Copy(buffer.Buffer, 0, _data, 0, _length); |
|
||||
_parent.RaiseReceived(_ip, _port, _data); |
|
||||
buffer.Socket.BeginReceive(buffer.Buffer, 0, buffer.Buffer.Length, SocketFlags.None, Callback, buffer); |
|
||||
} |
|
||||
else |
|
||||
{ |
|
||||
if (_client != null) |
|
||||
{ |
|
||||
if (_client.Connected) _client.Close(); |
|
||||
_client = null; |
|
||||
} |
|
||||
if (_ep != null) |
|
||||
{ |
|
||||
_parent.Remove(_ip + "-" + _port.ToString()); |
|
||||
_parent.RaiseClosed(_ip, _port); |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
else |
|
||||
{ |
|
||||
if (!string.IsNullOrEmpty(_ip)) _parent.Close(_ip, _port); |
|
||||
} |
|
||||
} |
|
||||
catch (Exception ex) |
|
||||
{ |
|
||||
_parent.RaiseExcepted(ex); |
|
||||
if (_client != null) |
|
||||
{ |
|
||||
if (_client.Connected) _client.Close(); |
|
||||
_client = null; |
|
||||
} |
|
||||
_parent.Close(_ip, _port); |
|
||||
} |
|
||||
_done.Set(); |
|
||||
} |
|
||||
|
|
||||
} |
|
||||
|
|
||||
} |
|
Loading…
Reference in new issue