Clojure で C スタイルの構造体を作成しようとしているので、文書化されていない C++ API を Clojure から呼び出すことができます。
API は、シリアル化された protobuf メッセージ (良い) の前に C ヘッダー構造体 (悪い) を送信および受信するように設計されています。最初のハンドシェイクは RPCHandshakeHeader 構造体であり、プロセスは次のコードで大まかに説明されています。
struct RPCHandshakeHeader {
char magic[8];
int version;
static const char REQUEST_MAGIC[9];
static const char RESPONSE_MAGIC[9];
};
[...snip...]
const char RPCHandshakeHeader::REQUEST_MAGIC[9] = "FooBar?\n";
[...snip...]
RPCHandshakeHeader header;
memcpy(header.magic, RPCHandshakeHeader::REQUEST_MAGIC, sizeof(header.magic));
header.version = 1;
socket = new CActiveSocket();
socket->Initialize();
socket->Open((const uint8 *)"localhost", 5000);
socket->Send((uint8*)&header, sizeof(header));
[...code to read response...]
clojureでこれを行うにはどうすればよいですか? JNA /JNIを使用する必要がありますか?
C 構造体を作成し、それをバイナリに変換してソケット経由で送信する方法はありますか? (これは私がしなければならないことだと思います)