gpt4 book ai didi

c - UNIX远程过程调用的端口和IP

转载 作者:行者123 更新时间:2023-11-30 17:41:41 26 4
gpt4 key购买 nike

我正在使用 RPC(远程过程调用)制作服务器客户端程序。客户端向服务器发送三个数字,服务器对这些数字进行求和,如果大于当前总和,则服务器将这三个数字发送回客户端。但我希望服务器发回客户端的端口和IP,但我不知道该怎么做。有没有简单的方法可以解决这个问题?

这是我的代码:

headerrpc.h

#include <rpc/rpc.h>
#include <rpc/xdr.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>

#define PROGRAM_EXEC ((u_long)0x40000000)
#define VERSIUNE_EXEC ((u_long)1)
#define EXEC_ADD ((u_long)2)

typedef struct Data{
short a;
short b;
short c;
u_short port;
}Data;

int xdr_Data(XDR* xdr, Data* d){
if(xdr_short(xdr,&(d->a)) == 0) return 0;
if(xdr_short(xdr,&(d->b)) == 0) return 0;
if(xdr_short(xdr,&(d->c)) == 0) return 0;
if(xdr_short(xdr,&(d->port)) == 0) return 0;
return 1;
}

服务器

#include "headerrpc.h"
#include <stdio.h>
#include <stdlib.h>

Data* data;

Data* add(Data* d){
static int sum = -32000;
//Data* data = (Data*)malloc(sizeof(Data));
if((d->a + d->b + d->c) > sum)
{

sum = d->a + d->b + d->c;
data->a = d->a;
data->b = d->b;
data->c = d->c;
data->port = data->port;
printf("It was found a greater sum %d\n");
return data;
}
else
{
printf("The sum of the given numbers is not greater than the current sum\n");
return data;
}
}

main(){
data = (Data*)malloc(sizeof(Data));
registerrpc(PROGRAM_EXEC, VERSIUNE_EXEC, EXEC_ADD, add, xdr_Data, xdr_Data);
svc_run();
}

客户端

#include "headerrpc.h"
#include <stdio.h>
#include <stdlib.h>

int main()
{
Data d;
Data* r = (Data*)malloc(sizeof(Data));
int suma;
printf("Client\n");

int a, b, c;
printf("Type the first number: ");
scanf("%d",&a);
printf("Type the second number: ");
scanf("%d",&b);
printf("Type the third number: ");
scanf("%d",&c);

d.a = a;
d.b = b;
d.c = c;
d.port = serv_addr.sin_port;

callrpc("localhost",PROGRAM_EXEC, VERSIUNE_EXEC,EXEC_ADD,(xdrproc_t)xdr_Data,(char*)&d,(xdrproc_t)xdr_Data,(char*)r);

printf("The numbers with the greater sum are: %d, %d, %d\n", r->a,r->b,r->c);
}

最佳答案

默认服务器例程实际上采用第二个参数struct svc_req *rqstp,从中可以确定客户端的IP地址。

因此您的添加函数定义应如下所示:

Data* add(Data* d, struct svc_req *rqstp) {

您可以从rqstp->rq_xprt->xp_raddr.sin_addr成员确定客户端的IP地址,同上从rqstp->rq_xprt->xp_raddr.sin_port端口> 成员(member)。

因为您使用的是registerrpc,这意味着该服务只能通过UDP使用,而不能通过IPv6使用,这意味着该地址是返回的 32 位值很简单。

我没有足够的 RPC over IPv6 经验,无法给出我知道在这种情况下可行的答案。

关于c - UNIX远程过程调用的端口和IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21025704/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com