1

サーバーからクライアントにポインターの配列を渡しています。ただし、クライアント側では、受信した配列を逆参照するとセグメンテーション違反が発生します。サーバーとクライアントはどちらも OS に対してローカルです。私はポインタで何らかの間違いを犯していて、ポインタの規則に違反していると思います。

コードは次のとおりです。

サーバー.c

struct WinGoku goku,windows,gates;

struct WinGoku *array[3];
array[0] = &goku;
array[1] = &windows;
array[2] = &gates;

send(conSocket, array, sizeof(&array), 0);

Client.c

struct WinGoku **array;

int rec =  recv(mySocket, array, 4, 0);

printf("bytes Recieved %d\n", rec);

int i;
for(i = 0; i<3;i++)
{
    printf("%s\n",array[i]->test);
}

struct WinGokuchar[50]でデータをコピーしているもののみが含まれていstrcpyます。

送受信は-1を返さないので、データは正常に送受信されています。

私がしている間違いは何ですか?

4

3 に答える 3

8

サーバーとクライアントはどちらも OS に対してローカルです。私はポインタである種の間違いを犯していると確信しており、いくつかのポインタ規則を無効にしています。

ポインタは「仮想メモリ」空間と呼ばれるものにあります。スコープは単一のプロセスに限定されます。

同じコンピューター上にあるにもかかわらず、サーバー、クライアントはそれぞれ独自の仮想メモリ空​​間を持っています。これらのポインタはそれぞれ無効です。ネットワーク経由で送信するメモリの内容をシリアル化(および通常はマーシャリング)する必要があります。

于 2013-10-23T18:00:33.827 に答える
5

ネットワーク経由でポインターを送信することはできません。技術的にはできますが、受信側システムで同じものを指すことはありません。

実際のオブジェクトが単純な場合、つまりポインターが含まれていない場合は、代わりに直接送信できます。

于 2013-10-23T17:58:32.483 に答える
0

sizeof(&array) は構造体 WinGoku * 3 のサイズではありません

そのはず(3*sizeof(WinGoku))

編集:

プロセスのポインターは、別のプロセスでアクセスできません。サーバーとクライアントの間で全体を送信する必要があります。

于 2013-10-23T18:05:40.437 に答える