0

移動用の構造体を定義します

typedef struct {
    MsgType msgType;
    int newFallenStonesSize;
    char *newFallenStones;
} MsgMove;

そして、次のようにデータを送信します。

MsgMove message;
message.msgType = MsgTypeMove;     
message.newFallenStones = (char *)malloc(nrNewFallenStones*sizeof(char));
for (int i=0; i<nrNewFallenStones; i++) {
    message.newFallenStones[i]=newFallenStones[i];
}
message.newFallenStonesSize = nrNewFallenStones;

NSData *data = [NSData dataWithBytes:&message length:(2*sizeof(int)+message.newFallenStonesSize*sizeof(char))];          

[[KKGameKitHelper sharedGameKitHelper] sendDataToAllPlayers:data reliable:YES]; 

送信時のデータは正しいですが、受信すると次のようになります。

else if (msg->msgType == MsgTypeMove)
{
    MsgMove *msgMove = (MsgMove *) [data bytes]; 
    for (int i=0; i<msgMove->newFallenStonesSize; i++) {
        NSLog(@"New Stone received:%i",msgMove->newFallenStones[i]);
    }
}

値が変更されました。たとえば、1、6、3 と I は 76、105 98 を受け取ります。

なぜこれが起こっているのか誰にも分かりますか?

4

1 に答える 1

2

主な問題は、実際のデータではなく、ネットワーク経由でデータへのポインターを送信していることです。スペースをmallocすると、構造message.newFallenStonesに隣接していないメモリ内の明らかにランダムな場所に設定されますMsgMove。次に、この別のメモリ ロケーションにデータを書き込みます。転送するためにパッケージ化するのは、MsgMove 構造体 (メモリ内の別の場所へのポインターを含む) と、メモリ内でその直後に発生するランダムなバイトです。

これを処理する一般的な方法は、代わりにメッセージ全体をまとめて malloc し、その末尾にデータを書き込むことです。もっと好き:

typedef struct {
    MsgType msgType;
    int newFallenStonesSize;
    char newFallenStones;        // The first newFallenStones value
} MsgMove;

そして一緒に送る

MsgMove *message;
message = (MsgMove *)malloc(sizeof(MsgMove)+nrNewFallenStones-1);
message->msgType = MsgTypeMove;     
message->newFallenStonesSize = nrNewFallenStones;
char *newStones = &MsgMove->newFallenStones;
for (int i=0; i<nrNewFallenStones; i++) {
    newStones[i]=newFallenStones[i];
}

NSData *data = [NSData dataWithBytes:message length:(sizeof(MsgMove)+nrNewFallenStones-1)];          

[[KKGameKitHelper sharedGameKitHelper] sendDataToAllPlayers:data reliable:YES]; 
于 2012-07-09T15:30:08.323 に答える