Я использую очень старый распределенный сервер безотказной работы https://ru1.sourceforge.net/ в Linux (в настоящее время opensuse jump 15.6), который генерирует часть кода для связи RPC путем вызова rpcgen. Из-за проблем с брандмауэром я изменил полученный код таким образом, чтобы использовался фиксированный порт TCP вместо случайного порта, созданного с помощью RPC_ANYSOCK.
Это работало нормально, пока код Sun RPC находился в glibc, но после этого был перенесен в libtirpc, он завершается автоматически, без каких-либо сообщений об ошибках.
Код, сгенерированный rpgcen, следующий (только основная процедура, включая мои изменения):
int main (int argc, char **argv) {
int c; // used by getopt
long server_port = -1;
register SVCXPRT *transp;
pmap_unset (RWPROG, RWVERS);
transp = svcudp_create(RPC_ANYSOCK);
if (transp == NULL) {
fprintf (stderr, "%s", "cannot create udp service.");
exit(1);
}
if (!svc_register(transp, RWPROG, RWVERS, rwprog_1, IPPROTO_UDP)) {
fprintf (stderr, "%s", "unable to register (RWPROG, RWVERS, udp).");
exit(1);
}
/* transp = svctcp_create(RPC_ANYSOCK, 0, 0); */
/* my code added: */
int sd;
struct sockaddr_in sin;
sd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&sin, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(62222);
bind(sd, &sin, sizeof(sin));
transp = svctcp_create(sd, 0, 0);
/* end of my code added */
if (transp == NULL) {
fprintf (stderr, "%s", "cannot create tcp service.");
exit(1);
}
if (!svc_register(transp, RWPROG, RWVERS, rwprog_1, IPPROTO_TCP)) {
fprintf (stderr, "%s", "unable to register (RWPROG, RWVERS, tcp).");
exit(1);
}
svc_run ();
fprintf (stderr, "%s", "svc_run returned");
exit (1);
/* NOTREACHED */
}
Часть, которую я добавил для замены ransp = svctcp_create(RPC_ANYSOCK, 0, 0); отмечена.
Это компилируется и запускается нормально, но вызывается "netstat -tulpn» после этого я вижу, что используется только порт udp (случайный номер порта). При возврате к «svctcp_create(RPC_ANYSOCK, 0, 0);» сервер также прослушивает (случайный) порт TCP.
Сравнивая запуск обоих серверов с помощью strace, я не понимаю, почему использование фиксированного порта не удается. Это важная часть использования RPC_ANYSOCK:
Я использую очень старый распределенный сервер безотказной работы https://ru1.sourceforge.net/ в Linux (в настоящее время opensuse jump 15.6), который генерирует часть кода для связи RPC путем вызова rpcgen. Из-за проблем с брандмауэром я изменил полученный код таким образом, чтобы использовался фиксированный порт TCP вместо случайного порта, созданного с помощью RPC_ANYSOCK. Это работало нормально, пока код Sun RPC находился в glibc, но после этого был перенесен в libtirpc, он завершается автоматически, без каких-либо сообщений об ошибках. Код, сгенерированный rpgcen, следующий (только основная процедура, включая мои изменения): [code]int main (int argc, char **argv) {