ZeroMQ C#Ironhouse的例子

时间:2017-10-13 06:45:20

标签: c# zeromq

我是ZeroMQ的新手,并且一直在使用 ZeroMQ NuGet包和 NetMQ & NetMQ Security NuGet包。

到目前为止,我还没有找到使用Curve Security的Ironhouse示例的C#版本。有一个" todo" ZGuides repo上的项目,但到目前为止还没有实现。 (https://github.com/metadings/zguide/issues/1

我也在尝试确定 NetMQ.Security 安全方法是否优于ZeroMQ 4中内置的曲线安全方法。看起来大多数有关Curve的信息至少来自2014年或更早。

非常感谢任何信息!

2 个答案:

答案 0 :(得分:2)

发布者和订阅者都需要使用自己的一组公钥/私钥。在您的订阅者示例代码中,您设置了["request number 1 output first element", "request number 2 output first element", "request number 3 output first element", "request number 4 output first element"] (对于服务器的代码,这是错误的但仍然是)但是没有设置CurvePublicKey - 这就是为什么你得到"无法打开客户端INITIATE保证"。以下是您修复的另一个问题的样本:

CurveSecretKey

答案 1 :(得分:0)

确实,使用 NetMQ 的 C# 示例并不多。我发现这有效“CurveTests.cs”:

        ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, R.layout.support_simple_spinner_dropdown_item, productsCat);
    arrayAdapter.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);
    categorie.setAdapter(arrayAdapter);

    categorie.setOnItemSelectedListener(new SpinnersEvents());
    product.setOnItemSelectedListener(new SpinnersEvents());

private class SpinnersEvents implements AdapterView.OnItemSelectedListener {

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        if (parent.getId() == R.id.spCategorie){
            String[] productsName = getProductName(productsCat[position]);
            ArrayAdapter<String> arrayAdapterChild = new ArrayAdapter<String>(getBaseContext(),R.layout.support_simple_spinner_dropdown_item, productsName);
            arrayAdapterChild.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);
            product.setAdapter(arrayAdapterChild);
        }else{
            price.setText(String.valueOf(tempList.get(position).getPrice()));
            imgPrd.setImageResource(tempList.get(position).getImage());
        }
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {

    }
}

重要说明 - 如果您想在不同的应用程序之间共享服务器公钥,请不要使用字符串表示 (serverPair.PublicKeyZ85),因为加密不起作用。我认为它与编码有关。更好地将字节数组表示保存到某个文件并共享它:

    public void CurveTest()
    {
        var serverPair = new NetMQCertificate();
        using var server = new DealerSocket();
        server.Options.CurveServer = true;
        server.Options.CurveCertificate = serverPair;
        server.Bind($"tcp://127.0.0.1:55367");
        
        var clientPair = new NetMQCertificate();
        using var client = new DealerSocket();
        client.Options.CurveServerKey = serverPair.PublicKey;
        client.Options.CurveCertificate = clientPair;
        client.Connect("tcp://127.0.0.1:55367");

        for (int i = 0; i < 100; i++)
        {
            client.SendFrame("Hello");
            var hello = server.ReceiveFrameString();
            Assert.Equal("Hello", hello);
            
            server.SendFrame("World");
            var world = client.ReceiveFrameString();
            Assert.Equal("World", world);
        }
    }