0

rpcgenを使用して、開発中のプログラムのクライアントとサーバーのスタブを生成しました。そのため、スタブはXDRを使用してデータをカプセル化し、ネット経由で送信します。このコードを実行すると、セグメンテーション違反がスローされます。

char *str = "Hello!";
my_remote_call(str, strlen(str));

代わりに、次のように変更しても問題はありません。

char *str = "Hello!";
char *str2 = (char*) malloc(strlen(str));
memcpy(str2, str, strlen(str));
my_remote_call(str2, strlen(str2));

GDBを使用すると、my_remote_call()によって呼び出されるxdr_u_char()関数でセグメンテーション違反が発生することがわかりました。私の質問は:

前者の場合、Hello文字列はコンパイラによって.rodataセクションに割り当てられ、後者の場合、ヒープの一部が文字列を記憶するために使用されます。xdr_u_char署名には明示的に必要なため、セグメンテーション違反が発生する可能性があります

char*

ではなく

const char*

あなたがここで見ることができるように?したがって、この場合、xdr_u_char()関数がデータを変更することを意味しますか?

4

2 に答える 2

0

送信ではなく受信時にデータを変更していると思います。リモートコールが実際にXDR_ENCODEモード付きのXDRを使用していることを確認しますか?

于 2011-11-06T11:14:07.017 に答える
0

文字列をXDRに送信するには、 xdr_stringnot xdr_u_char;を使用する必要があります。*.xのファイルを見せてくださいrpcgen ...

于 2011-11-06T11:35:34.317 に答える