2012-07-09 2 views
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과 나는 76, 105를 받는다. 98.

왜 이런 일이 일어나는 지 알고있다.

답변

2

중요한 문제는 실제 데이터가 아닌 네트워크를 통해 데이터에 대한 포인터를 보내고 있다는 것입니다. message.newFallenStones에 대한 malloc 공간은 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]; 
로 보내