2011-10-28 3 views
0

GKTankの例の構造体にintとCGPointデータを正常に送信しましたが、NSStringを送信しようとしました。私も...ない成功を持つ代わりに、NSStringのの文字でGKTankの例を使用してNSStringを送信する方法

を、それを試してみました。ここ を送信するためのコードです:

NSString *playerName = @"My Name"; 
NSData *dat = [playerName dataUsingEncoding:NSUTF8StringEncoding]; 
[BTINconnector sendNetworkPacketwithPacketID:NETWORK_PLAYERNAME withData:dat ofLength:sizeof(dat) reliable:YES]; 

を(GKTankから知られ、修正された)方法は

- (void)sendNetworkPacketwithPacketID:(int)packetID withData:(void *)data ofLength:(int)length reliable:(BOOL)howtosend { 
    //NSLog(@"bmpc:ok 3 send packet to %i",gamePeerId); 
    // the packet we'll send is resued 
    static unsigned char networkPacket[kMaxPacketSize]; 
    const unsigned int packetHeaderSize = 2 * sizeof(int); // we have two "ints" for our header 

    if(length < (kMaxPacketSize - packetHeaderSize)) { // our networkPacket buffer size minus the size of the header info 
     int *pIntData = (int *)&networkPacket[0]; 
     // header info 
     pIntData[0] = gamePacketNumber++; 
     pIntData[1] = packetID; 
     // copy data in after the header 
     memcpy(&networkPacket[packetHeaderSize], data, length); 

     NSData *packet = [NSData dataWithBytes: networkPacket length: (length+8)]; 
     if(howtosend == YES) { 
      [mySession sendData:packet toPeers:[NSArray arrayWithObject:gamePeerId] withDataMode:GKSendDataReliable error:nil]; 
     } else { 
      [mySession sendData:packet toPeers:[NSArrayarrayWithObject:gamePeerId] withDataMode:GKSendDataUnreliable error:nil]; 
    } 
    } 
} 

と受信方法(私が変更したGKタンクから)

- (void)receiveDataDG:(NSData *)data fromPeer:(NSString *)peer inSession:(GKSession *)session context:(void *)context { 
    static int lastPacketTime = -1; 
    unsigned char *incomingPacket = (unsigned char *)[data bytes]; 
    int *pIntData = (int *)&incomingPacket[0]; 
    NSData* nData = (NSData*)&incomingPacket[0]; 
    //NSData* bData = nData[8]; 
    // 
    // developer check the network time and make sure packers are in order 
    // 
    int packetTime = pIntData[0]; 
    int packetID = pIntData[1]; 
    if(packetTime < lastPacketTime && packetID != NETWORK_COINTOSS) { 
     NSLog(@"bmc: EXITED"); 
     return; 
    } 

    lastPacketTime = packetTime; 
    switch(packetID) { 
     case NETWORK_PLAYERNAME: 
     { 
NSData *hjk = [NSData dataWithBytes:&pIntData[2] length:sizeof(int)]; 

      NSString *gotitb = [[NSString alloc] initWithData:hjk encoding:NSUTF8StringEncoding]; 
      NSLog(@"bmc:str %@,%@",gotitb,gotitb); 
… 

go titbはnullを返すが、私は理由を知らない。助けてください。

答えて

0

sizeof(dat)あなたはほしいとは思わない[dat length]

+0

文字列がまだNULLです。 – MarkWayne

+0

同じ問題があります。 NSData * hjk = [NSData dataWithBytes:&pIntData [2] length:sizeof(int)]; sizeof pIntDataにする必要があります – logancautrell

+0

まだ成功していません。 NSLog(@ "%s"、データ)でデータを読むと、<00000000 06000000 abf3b7fb 2b>と表示されます。 3番目のブロックは必要なデータです。 Intは動作していますが、NSStringは – MarkWayne

関連する問題