Skip to content

A simple message format for automatically length-prefixing messages over any socket or stream

License

Notifications You must be signed in to change notification settings

besterprotocol/bformat

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

77 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

bformat

D DUB DUB DUB Coverage Status

A simple message format for automatically length-prefixing messages over any Socket or River-based Stream.

What is bformat?

bformat makes it easy to build applications whereby you want to send data over a streaming interface (either a Socket opened in SocketType.STREAM mode or a River-based Stream) and want to be able to read the data as length-prefixed messages, without the hassle of implementing this yourself. This is where bformat shines by providing support for this in a cross-platform manner so you do not have to worry about implementing it yourself countless times again every time you require such functionality in a project.

Usage

You can see the API for information on how to use it but it boils down to spawning a new BClient which takes in either a Socket or Stream (see River) and then you can either send data using sendMessage(byte[]) and receive using receiveMessage(ref byte[]).

Below we have an example application which does just this:

/**
 * Create a server that encodes a message to the client
 * and then let the client decode it from us; both making
 * use of `BClient` to accomplish this
 */
unittest
{
	UnixAddress unixAddr = new UnixAddress("/tmp/bformatServer.sock");

	scope(exit)
	{
		import std.stdio;
		remove(cast(char*)unixAddr.path());
	}

	Socket serverSocket = new Socket(AddressFamily.UNIX, SocketType.STREAM);
	serverSocket.bind(unixAddr);
	serverSocket.listen(0);

	class ServerThread : Thread
	{
		private Socket servSock;

		this(Socket servSock)
		{
			this.servSock = servSock;
			super(&worker);
		}

		private void worker()
		{
			Socket clientSock = servSock.accept();

			BClient bClient = new BClient(clientSock);

			byte[] message = cast(byte[])"ABBA";
			bClient.sendMessage(message);
		}
	}

	Thread serverThread = new ServerThread(serverSocket);
	serverThread.start();

	Socket client = new Socket(AddressFamily.UNIX, SocketType.STREAM);
	client.connect(unixAddr);
	BClient bClient = new BClient(client);

	byte[] receivedMessage;
	bClient.receiveMessage(receivedMessage);
	assert(receivedMessage == "ABBA");
	writeln(receivedMessage);
	writeln(cast(string)receivedMessage);
}

Adding to your peoject

It's rather easy to add it to your D project, just run the command dub add bformat.

License

The license used is LGPL v3.

About

A simple message format for automatically length-prefixing messages over any socket or stream

Topics

Resources

License

Stars

Watchers

Forks

Languages