当我从服务器向客户端发送字符串时出现问题,它只发送一个数字为“1”的字符。
rpc.x
struct IdentIP{
char *ip;
int puerto;
};
program SERVIDORCHAT {
version BASICA {
IdentIP query(string) = 3;
} = 1;
} = 0x40001234;
查询功能的问题。
rpc.c
IdentIP * query_1_svc(char **nick, struct svc_req *r)
{
static IdentIP result;
result.port = -1;
Client *c;
int i = search_client(*nick);
if (i == -1) // No ha sido encontrado
return (&result);
c = clientes[i];
result.port = ntohs(c->endpoint->sin_port);
result.ip = malloc(sizeof(char)*15);
strcpy(result.ip,inet_ntoa(c->endpoint->sin_addr));
printf("IP: %s\n",result.ip); //HERE PRINTS THE IP CORRECTLY
return (&result);
}
我的第一个虽然是我用inet_ntoa严重改变了格式,或者我没有足够的保存内存,但我尝试了所有并且无法工作。
client.c
sscanf(linea, "%s %s", cmd, friend);
/***** Query al servidor del chat ****/
IdentIP *info_friend;
info_friend = query_1(&friend, clnt);
printf("IP: %s PUERTO: %d\n",(*info_friend).ip,(*info_friend).puerto);
//HERE PRINT "IP: 1" WHEN THE IP IS "192.168.1.103"
puerto_destino = (*info_friend).puerto;
strcpy(ip_destino, (*info_friend).ip);
端口工作正常,但无论我做什么,ip总是打印'1'。 我希望有人能找到错误,非常感谢你。
答案 0 :(得分:0)
字符串不会复制到正确的结果缓冲区中:
strcpy(resultado.ip, inet_ntoa(c->endpoint->sin_addr));
return (&resultado);
应该是:
strcpy(result.ip, inet_ntoa(c->endpoint->sin_addr));
return (&result);
还可以更好地为具有16个字符的ip分配缓冲区,因为您需要为null终止符保留一个字符。
result.ip = malloc(16);
答案 1 :(得分:0)
我发现问题,在xdr中你必须声明char *就像一个动态的字符串数组。 .x的好代码就是这个。
<强> rpc.x 强>
struct IdentIP{
string ip<>; //HERE ITS THE CHANGE
int puerto;
};
program SERVIDORCHAT {
version BASICA {
IdentIP query(string) = 3;
} = 1;
} = 0x40001234;