Ошибка сегментации (дамп ядра) на стороне сервера в приложении CORBA C ++ / Java

У меня есть такой код:

interface Employee
{
string getLastname();
};

#include "Employee.idl"
interface Work
{
Employee getEmployee(in short id);
};

Файлы сервера:

#include "Employee.hh"
class EmployeeImpl : public POA_Employee
{
private:
char* lastname;
int id;

public:
EmployeeImpl(const char* lastname, int id);
char* getLastname();
};

#include "EmployeeImpl.h"
EmployeeImpl::EmployeeImpl(const char* lastname, int id)
{
this->lastname = const_cast<char*>(lastname);
this->id = id;
}

char* EmployeeImpl::getLastname()
{
return this->lastname;
}

#include "Work.hh"#include <vector>
#include "EmployeeImpl.h"using namespace std;

class WorkImpl : public POA_Work
{
private:
vector<EmployeeImpl> employees;

public:
WorkImpl();
Employee_ptr getEmployee(::CORBA::Short id);
};

#include "WorkImpl.h"
WorkImpl::WorkImpl()
{
EmployeeImpl ei1("Doe", 1);
EmployeeImpl ei2("Smith", 2);
EmployeeImpl ei3("Brown", 3);

employees.push_back(ei1);
employees.push_back(ei2);
employees.push_back(ei3);
}

Employee_ptr WorkImpl::getEmployee(::CORBA::Short id)
{
return employees[id]._this();
}

Клиентские файлы:

import java.util.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;
import java.io.*;

public class Client
{
public static void main(String [] args)
{
try
{
org.omg.CORBA.ORB clientORB = org.omg.CORBA.ORB.init(args, null);

if (clientORB == null)
{
System.out.println("Problem while creating ORB");
System.exit(1);
}

org.omg.CORBA.Object objRef = clientORB.resolve_initial_references("NameService");
NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);

Work work = WorkHelper.narrow(ncRef.resolve_str("WorkService"));
Employee e = work.getEmployee((short)1);
System.out.println(e.getLastname());
e = work.getEmployee((short)2);
System.out.println(e.getLastname());
e = work.getEmployee((short)3);
System.out.println(e.getLastname());

}catch(Exception e){ System.out.println(e.getMessage()); }
}
}

когда я запускаю сервер, а затем клиента, на стороне клиента я вижу:

кузнец

вместо:

Doe
Smith
Brown

и когда клиент получил сообщение, на стороне сервера я вижу:

ошибка сегментации (справка сброшена)

и сервер падает. Что не так с моим кодом, ребята? Я использую omniORB и idlj на Kubuntu, а также g ++ и javac для компиляции моих файлов.

Вот мой весь проект: http://www44.zippyshare.com/v/60244821/file.html

1

Решение

Вы не следуете правилам отображения IDL в C ++ при передаче параметров. В частности, на сервере:

char* EmployeeImpl::getLastname()
{
return this->lastname;   // this is the problem
}

Вам необходимо вернуть динамически выделенную память, потому что скелетный код собирается ее освободить (с CORBA::string_free) после того, как это маршалирует это по проводу к клиенту.

Это должно быть:

char* EmployeeImpl::getLastname()
{
return CORBA::string_dup(this->lastname);
}

Это все объясняется в Хеннинге & Книга Виновского Расширенное программирование на CORBA с C ++.

Другая проблема, с которой вы столкнулись, заключается в том, что вы индексируете свой вектор с помощью индекса на основе 1. Но вектор использует схему индекса на основе 0. Чтобы это исправить, либо измените клиентские вызовы, либо измените реализацию вашего сервера на что-то вроде этого:

Employee_ptr WorkImpl::getEmployee(::CORBA::Short id)
{
if (id >= 1 && id <= employees.size())
{
return employees[id - 1]._this();  // convert to 0-based indexing
}
else
{
// throw some type of exception
}
}
5

Другие решения

Других решений пока нет …

Похожие вопросы
Добавить ответ
Для оформления сообщений Вы можете использовать следующие тэги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Нажимая кнопку «Отправить», я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности этого сайта.