78 lines
1.8 KiB
C#
78 lines
1.8 KiB
C#
using System;
|
|
using ZMQ;
|
|
using System.IO;
|
|
using Thrift.Transport;
|
|
|
|
namespace ZmqClient
|
|
{
|
|
public class TZmqClient : TTransport
|
|
{
|
|
Socket _sock;
|
|
String _endpoint;
|
|
MemoryStream _wbuf = new MemoryStream ();
|
|
MemoryStream _rbuf = new MemoryStream ();
|
|
|
|
void debug (string msg)
|
|
{
|
|
//Uncomment to enable debug
|
|
// Console.WriteLine (msg);
|
|
}
|
|
|
|
public TZmqClient (Context ctx, String endpoint, SocketType sockType)
|
|
{
|
|
_sock = ctx.Socket (sockType);
|
|
_endpoint = endpoint;
|
|
}
|
|
|
|
public override void Open ()
|
|
{
|
|
_sock.Connect (_endpoint);
|
|
}
|
|
|
|
public override void Close ()
|
|
{
|
|
throw new NotImplementedException ();
|
|
}
|
|
|
|
public override bool IsOpen {
|
|
get {
|
|
throw new NotImplementedException ();
|
|
}
|
|
}
|
|
|
|
public override int Read (byte[] buf, int off, int len)
|
|
{
|
|
debug ("Client_Read");
|
|
if (off != 0 || len != buf.Length)
|
|
throw new NotImplementedException ();
|
|
|
|
if (_rbuf.Length == 0) {
|
|
//Fill the Buffer with the complete ZMQ Message which needs to be(?!) the complete Thrift response
|
|
debug ("Client_Read Filling buffer..");
|
|
byte[] tmpBuf = _sock.Recv ();
|
|
debug (string.Format("Client_Read filled with {0}b",tmpBuf.Length));
|
|
_rbuf.Write (tmpBuf, 0, tmpBuf.Length);
|
|
_rbuf.Position = 0; //For reading
|
|
}
|
|
int ret = _rbuf.Read (buf, 0, len);
|
|
if (_rbuf.Length == _rbuf.Position) //Finished reading
|
|
_rbuf.SetLength (0);
|
|
debug (string.Format ("Client_Read return {0}b, remaining {1}b", ret, _rbuf.Length - _rbuf.Position));
|
|
return ret;
|
|
}
|
|
|
|
public override void Write (byte[] buf, int off, int len)
|
|
{
|
|
debug ("Client_Write");
|
|
_wbuf.Write (buf, off, len);
|
|
}
|
|
|
|
public override void Flush ()
|
|
{
|
|
debug ("Client_Flush");
|
|
_sock.Send (_wbuf.GetBuffer ());
|
|
_wbuf = new MemoryStream ();
|
|
}
|
|
}
|
|
}
|
|
|