运行在Windows上的C#和使用protobuf在Linux上运行的C之间的通信

时间:2012-03-29 12:34:01

标签: windows linux communication protocol-buffers

我在Linux上运行了一个服务器应用程序。这个应用程序是 使用protobuf c和protobuf.rpc.c文件开发用于RPC通信。

我有一个在windows上运行的客户端应用程序。它是用c#开发的,使用protobuf-net.dll和ProtobufRemote.dll进行RPC通信。这两个应用程序使用相同的服务方法的原型文件。

我可以使用以下代码从C#客户端应用程序创建代理。

using System.Configuration;
using System.Net.Sockets;
using ProtoBufRemote; // rpc reference
using StarCall; // proto file 

#region Create client connection

            Int32 port = Convert.ToInt32(ConfigurationManager.AppSettings["PORT"]);
            TcpClient tcpClient = new TcpClient(ConfigurationManager.AppSettings["SERVERIP"].ToString(), port);

            var controller = new RpcController();
            var client = new RpcClient(controller);

            var channel = new NetworkStreamRpcChannel(controller, tcpClient.GetStream());
            channel.Start();

            var service = client.GetProxy<Istarcall_services>();

            if (service == null)
                Console.WriteLine("error creating client..");

            //now calls can be made, they will block until a result is received 
            Console.WriteLine("Client connected to Server....\n");
  #endregion

但是每当我尝试从C#客户端应用程序调用服务方法时,如下所示,应用程序挂起并且没有从Linux c服务器应用程序获得任何响应。

        try
        {
            Room_Config room = new Room_Config();
            room.Room_Dial_Num = 1;
            Room_Config roomRet = service.read_room(room); // service method
        }
        catch (Exception)
        {


        throw;
    }

该应用程序挂在下面的代码中。

protected RpcMessage.Parameter EndAsyncCallHelper(string methodName, IAsyncResult asyncResult)
        {
            PendingCall pendingCall = (PendingCall)asyncResult;

            pendingCall.AsyncWaitHandle.WaitOne(); // application hanging here
            pendingCall.AsyncWaitHandle.Close();

            if (pendingCall.IsFailed)
                throw new InvalidRpcCallException(serviceName, methodName,
                    String.Format("Server failed to process call, returned error message: \"{0}\".",
                    pendingCall.ServerErrorMessage));

            return pendingCall.Result;
        }

根据上述情况,我有以下疑问。

  1. 这个protobuf远程c#dll是否可以帮助从linux c代码创建一个通信。如果没有,请帮助我如何使用linux c代码创建一个通信通道。

  2. 请提供c#客户端应用程序的任何替代rpc dll,以便与linux protobuf c和protobuf rpc.c文件进行通信。

  3. 请告诉我上述方法是否错误,并使用合适的解决方案纠正。

  4. 请帮帮我。如果不清楚请发送到下面提到的邮件。

1 个答案:

答案 0 :(得分:0)

您是否在Linux中使用ProtoBufRemote cpp在https://code.google.com/p/protobuf-remote/处实现了服务器?

如果是,那么你必须更换或修改SocketRpcChannel.cpp类,因为它使用的是不适用于Linux的WinSock2。 你这样做了吗?如果是,请分享您在服务器中使用的已修改的SocketRpcChannel类。

谢谢。