Прошу прощения за пакеты данных в течение 36 часов, пожалуйста, помогите! - PullRequest
0 голосов
/ 15 сентября 2009

Хорошо. Вот проблема. Я пытаюсь отправить через структуру или что-нибудь через Apple, Bluetooth отправить код сетевого пакета. Код для отправки ниже

-(void)sendMessagePacket:(GKSession *)session packetID:(int)packetID withData:(void *)data ofLength:(int)length reliable:(BOOL)howtosend {

static unsigned char networkPacket[maxPacketSize];
const unsigned int packetHeaderSize = 2 * sizeof(int); // we have two "ints" for our header

if(length < (maxPacketSize - packetHeaderSize)) { // our networkPacket buffer size minus the size of the header info
    int *pIntData = (int *)&networkPacket[0];
    // header info
    pIntData[0] = 10;
    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) { 
        [session sendDataToAllPeers:packet withDataMode:GKSendDataReliable error:nil];
    } else {
        [session sendDataToAllPeers:packet withDataMode:GKSendDataUnreliable error:nil];
    }
}   

}

Если бы кто-нибудь мог пройти через это с расческой и объяснить, что происходит, это было бы очень признательно. Далее получим код.

- (void)receiveData:(NSData *)data fromPeer:(NSString *)peer inSession: (GKSession *)session context:(void *)context {
// Caller whenever data is received from the session
unsigned char *incomingPacket = (unsigned char *)[data bytes];  

//EXPECTS THAT WHAT IS IN INCOMING PACKET [0] TO BE OF DATA TYPE INTEGER
int *pIntData = (int *)&incomingPacket[0];

int packetTime = pIntData[0];

int packetID = pIntData[1];

static int lastPacketTime = -1;

    switch (packetID) {
    case NETWORK_COINTOSS:
        //DO SOMETHING
        break;

        case NETWORK_TEXT_EVENT:

            NSString *fewMore = (NSString *)&incomingPacket[8];

             fewThings *bitMore = &fewMore[peer];

            //NSLog(@"Trace Bit More: %@",fewMore);
            break;
    default:
        break;
}


NSInteger lengthBytes = [data length];
NSLog(@"Length of data : %i", lengthBytes);

}

То, что я пытаюсь понять, являясь новинкой в ​​достижении цели c, - это то, как все это работает, как получить доступ к отправленной мной строке, так как все попытки зарегистрировать ее вызывают сбой программы.

Ниже приведен код, используемый для начала отправки:

    NSString *bigWord = @"BigWordBigWord";
NSInteger len = [bigWord length];
[self sendMessagePacket:gameSession  packetID:NETWORK_TEXT_EVENT withData:bigWord ofLength:(len) reliable:YES];

Любая помощь будет так цениться. Спасибо.

Ответы [ 2 ]

1 голос
/ 15 сентября 2009

Вам действительно нужно изменить объект NSString в представление UTF8 для отправки или заархивировать его как объект NSData, который вы отправляете с полной длиной - вы не можете просто привести NSString как строку C (либо для отправки или получение !!!).

Вы можете получить строковую версию C строки NSString, используя:

const char * sendString = [bigWord cStringUsingEncoding: NSUTF8StringEncoding]

А затем извлеките его из входящего объекта NSData с помощью

NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
0 голосов
/ 23 ноября 2009

Этот парень просто отправляет и получает строку по сети. Но я также все еще получаю сообщение об ошибке на принимающей стороне.

http://discussions.apple.com/thread.jspa?messageID=10215848

Наконец-то понял. GKTank передает данные с помощью struct, поэтому я поместил свою строку в структуру, а остальное - история.

typedef struct {
    NSString *strInfo;
} myInfo;
...