Код RPC, разработанный на el 7, не работает на el8
Я портирую приложение с el 7, используя вызовы glibc rpc (многие из них, но в основном svc_register). Я добавил библиотеку libtirpc в свою сборку, она компилируется и запускается, но не создает сокет. Код выглядит следующим образом:
void RpcServer
::run_server()
{
pmap_unset (RPCNetwork, FIRST__VERSION);
m_sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_sock == -1)
{
LOG_ERROR(logger, "Unable to create a socket for the RPC server.");
return;
}
//close the socket immediately on a close call
struct linger linger = {1, 0};
if(!setsockopt(m_sock, SOL_SOCKET, SO_LINGER, &linger, sizeof(linger)) == -1)
{
LOG_DEBUG(logger, "unable to set socket options for rpc server.");
}
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(m_server_port);
addr.sin_addr.s_addr = 0;
bool bound = false;
while(!bound)
{
if(bind(m_sock, reinterpret_cast<struct sockaddr*>(&addr), sizeof addr) == -1)
{
LOG_ERROR(logger,
"Unable to bind created rpc socket to server port " << m_server_port << "."
);
boost::this_thread::sleep(boost::posix_time::seconds(1));
}
else
{
LOG_DEBUG(logger, "Was able to bind created socket to server")
bound = true;
}
}
if(!bound)
{
LOG_ERROR(logger,
"Tried to bind the the RPC server port 10 times without success. Giving up."
);
return;
}
m_transp = svctcp_create(m_sock, 102400, 102400);
if (m_transp == NULL)
{
LOG_ERROR(logger, "cannot create tcp service.");
return;
}
if (!svc_register(
m_transp,
RPCNetwork,
FIRST__VERSION,
&RpcServer::m_rpc_network,
IPPROTO_TCP
))
{
LOG_ERROR(logger,
"unable to register with portmapper. Trying to register without portmapper."
);
if(!svc_register(
m_transp,
RPCNetwork,
FIRST__VERSION,
&RpcServer::m_rpc_network,
0
))
{
LOG_ERROR(logger, "unable to register without portmapper. Giving up.");
return;
}
} else {
LOG_DEBUG(logger, "successful return code from svc_register");
}
LOG_DEBUG(logger, "Successfully registered!");
}
Когда я запускаю это на el 8, он говорит, что успешно зарегистрирован, но сокет недоступен, но на el 7 он работает.