Это работало нормально, пока код 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 */
}
Это компилируется и запускается нормально, но вызывается "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]