, , - , .
.Net , Begin * End *. - BeginReceive EndReceive. ( Receive); .
, , - -, IOCP (IO Completion Ports, Linux/Mono , ), ; IOCP , , .
/
Begin * 2 , . - AsyncCallback, - . , " , ", " , ". , , , End *, , , . , :
private void BeginReceiveBuffer()
{
_socket.BeginReceive(buffer, 0, buffer.Length, BufferEndReceive, buffer);
}
private void EndReceiveBuffer(IAsyncResult state)
{
var buffer = (byte[])state.AsyncState;
var length = _socket.EndReceive(state);
DataReceived(buffer, 0, length);
}
.Net , , EndReceiveBuffer " " ( buffer) state.AsyncResult, EndReceive, ( , - ).
- , "" (, TCP , , Stream ).
private Socket _socket;
private ArraySegment<byte> _buffer;
public void StartReceive()
{
ReceiveAsyncLoop(null);
}
private void ReceiveAsyncLoop(IAsyncResult result)
{
try
{
if (result != null)
{
int numberOfBytesRead = _socket.EndReceive(result);
if(numberOfBytesRead == 0)
{
OnDisconnected(null);
return;
}
var newSegment = new ArraySegment<byte>(_buffer.Array, _buffer.Offset, numberOfBytesRead);
OnDataReceived(newSegment);
}
_socket.BeginReceive(_buffer.Array, _buffer.Offset, _buffer.Count, SocketFlags.None, ReceiveAsyncLoop, null);
}
catch (Exception ex)
{
}
}
, , .. ( ) . , :
public class InboundConnection
{
private Socket _socket;
private ArraySegment<byte> _buffer;
public InboundConnection(Socket clientSocket)
{
_socket = clientSocket;
_buffer = new ArraySegment<byte>(new byte[4096], 0, 4096);
StartReceive();
}
private void StartReceive() ...
private void ReceiveAsyncLoop() ...
private void OnDataReceived() ...
}
( , , / ).