Программирование rpc/socket на C: замена RPC_ANYSOCK на фиксированный портLinux

Ответить
Anonymous
 Программирование rpc/socket на C: замена RPC_ANYSOCK на фиксированный порт

Сообщение Anonymous »

Я использую очень старый распределенный сервер безотказной работы 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:

Код: Выделить всё

getsockname(4, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("0.0.0.0")}, [128 => 16]) = 0
getsockopt(4, SOL_SOCKET, SO_TYPE, [1], [4]) = 0
getsockname(4, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("0.0.0.0")}, [128 => 16]) = 0
getsockname(4, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("0.0.0.0")}, [128 => 16]) = 0
getsockname(4, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("0.0.0.0")}, [128 => 16]) = 0
openat(AT_FDCWD, "/proc/sys/net/ipv4/ip_local_reserved_ports", O_RDONLY) = 5
fstat(5, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
read(5, "\n", 1024)                     = 1
read(5, "", 1024)                       = 0
close(5)                                = 0
bind(4, {sa_family=AF_INET, sin_port=htons(63242), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
listen(4, 4096)                         = 0
getpeername(4, 0x7ffe8af2fa10, [128])   = -1 ENOTCONN (Transport endpoint is not connected)
getsockname(4, {sa_family=AF_INET, sin_port=htons(63242), sin_addr=inet_addr("0.0.0.0")}, [128 => 16]) = 0
getsockopt(4, SOL_SOCKET, SO_TYPE, [1], [4]) = 0
getsockname(4, {sa_family=AF_INET, sin_port=htons(63242), sin_addr=inet_addr("0.0.0.0")}, [128 => 16]) = 0
openat(AT_FDCWD, "/etc/netconfig", O_RDONLY) = 5
fstat(5, {st_mode=S_IFREG|0644, st_size=767, ...}) = 0
read(5, "#\n# The network configuration fi"..., 4096) = 767
close(5)                                = 0
socket(AF_UNIX, SOCK_STREAM, 0)         = 5
rt_sigprocmask(SIG_SETMASK, ~[RTMIN RT_1], [], 8) = 0
getpeername(5, 0x7ffe8af2f730, [128])   = -1 ENOTCONN (Transport endpoint is not connected)
connect(5, {sa_family=AF_UNIX, sun_path="/var/run/rpcbind.sock"}, 23) = 0
getsockname(5, {sa_family=AF_UNIX}, [128 => 2]) = 0
getsockopt(5, SOL_SOCKET, SO_TYPE, [1], [4]) = 0

С моим кодом с фиксированным портом я получаю следующее:

Код: Выделить всё

openat(AT_FDCWD, "/etc/netconfig", O_RDONLY) = 4
fstat(4, {st_mode=S_IFREG|0644, st_size=767, ...}) = 0
read(4, "#\n# The network configuration fi"..., 4096) = 767
close(4)                                = 0
socket(AF_UNIX, SOCK_STREAM, 0)         = 4
rt_sigprocmask(SIG_SETMASK, ~[RTMIN RT_1], [], 8) = 0
getpeername(4, 0x7fff5be340b0, [128])   = -1 ENOTCONN (Transport endpoint is not connected)
connect(4, {sa_family=AF_UNIX, sun_path="/var/run/rpcbind.sock"}, 23) = 0
getsockname(4, {sa_family=AF_UNIX}, [128 => 2]) = 0
getsockopt(4, SOL_SOCKET, SO_TYPE, [1], [4]) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
getpid()                                = 1701
rt_sigprocmask(SIG_SETMASK, ~[RTMIN RT_1], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_SETMASK, ~[RTMIN RT_1], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
geteuid()                               = 0
rt_sigprocmask(SIG_SETMASK, ~[RTMIN RT_1], [], 8) = 0
write(4, "\200\0\0T

Подробнее здесь: [url]https://stackoverflow.com/questions/78828974/rpc-socket-programming-in-c-replacing-rpc-anysock-by-fixed-port[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»