Связь между C #, работающим в Windows, и C, работающим в linux с protobuf - PullRequest
0 голосов
/ 29 марта 2012

У меня есть серверное приложение, работающее в Linux. Это приложение было разработано с использованием файлов protobuf c и protobuf.rpc.c для связи RPC.

У меня есть клиентское приложение, которое работало на Windows. Оно было разработано в c # с использованием protobuf-net.dll и ProtobufRemote.dll для связи RPC. Оба приложения используют тот же файл proto, имеющий те же методы обслуживания.

Я могу создать прокси из клиентского приложения 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. Может ли этот протобуф удаленный c # dll помочь в создании связи из кода linux c. Если нет, пожалуйста, помогите мне, как создать канал связи с кодом Linux Linux.

  2. Пожалуйста, укажите, есть ли альтернативный rpc dll для клиентского приложения c # для связи с linux protobuf c и файлом protobuf rpc.c.

  3. Пожалуйста, скажите мне, если мой вышеупомянутый подход неверен, и исправьте подходящим решением.

Пожалуйста, помогите мне. Если не ясно, пожалуйста, отправьте на почту, указанную ниже.

1 Ответ

0 голосов
/ 05 марта 2013

Реализовали ли вы свой сервер в Linux с ProtoBufRemote cpp, доступным по адресу https://code.google.com/p/protobuf-remote/ ??

Если да, то вы должны заменить или изменить класс SocketRpcChannel.cpp, так как он использует WinSock2, то естьне применимо в Linux.Вы сделали это?Если да, пожалуйста, поделитесь измененным классом SocketRpcChannel, который вы использовали на своем сервере.

Спасибо.

...