2009-11-23 1 views
0

Я использую sendto() и recvfrom() для отправки некоторых простых пакетов через UDP через WiFI.iphone проблема с UDP-пакетами

Я попытался с помощью двух телефонов и симулятор, результаты я получаю являются:

Пакеты, посланные от телефонов -> мь тренажере Пакеты, отправленные из симулятора -> Тренажер recvfrom остается блокирование. Пакеты, отправленные с телефонов -> другой телефон recvfrom остается блокировкой.

Я не уверен, как начать отладку этого, поскольку симулятор/mac способен принимать пакеты, но телефоны, похоже, не получают сообщение.

Немного в сторону, мне нужно сохранить мои пакеты ниже MTU для моей сети? Или фрагментация обрабатывается ОС или другим программным обеспечением более низкого уровня?

UPDATE: Я забыл указать размер и структуру пакета. Я передача:

typedef struct PacketForTransmission { 
    int32_t packetTypeIdentifier; 
    char data[64]; // size to fit my biggest struct 
} PacketForTransmission; 

из которых данные символьных [64] является:

typedef struct PacketHeader{ 
    uint32_t identifier; 
    uint32_t datatype; 
} PacketHeader; 

typedef struct BasePacket{ 
    PacketHeader header; 
    int32_t cardValue; 
    char sendingDeviceID[41]; //dont forget to save room for the NULL terminator! 
} BasePacket; 

typedef struct PositionPacket{ 
    BasePacket basePacket; 
    int32_t x; 
    int32_t y; 
} PositionPacket; 

отправки пакета, как:

PositionPacket packet; 
bzero(&packet, sizeof(packet)); 
//fill packet with it's associated data 

PacketForTransmission transmissionPacket; 
transmissionPacket.packetTypeIdentifier = kPositionPacketType; 
memcpy(&transmissionPacket.data, (void*)&packet, sizeof(packet)); //put the PositionPacket into data[64] 

size_t sendResult = sendto(_socket, &transmissionPacket, sizeof(transmissionPacket), 0, [address bytes], [address length]); 
NSLog(@"packet sent of size: %i", sendResult); 

и ПОЛУЧАТЬ пакеты, как:

while(1){ 
    char dataBuffer[8192]; 
     struct sockaddr addr; 
    socklen_t socklen = sizeof(addr); 
    ssize_t len = recvfrom(_socket, dataBuffer, sizeof(dataBuffer), 0, &addr, &socklen); //continues blocking here 
     NSLog(@"packet recieved of length: %i", len); 

    //do some more stuff 
} 
+1

Пожалуйста, введите код. –

+0

Любая информация о том, какие порты вы используете? –

+0

Я использую bonjour, поэтому порты являются «любым доступным портом», – SooDesuNe

ответ

0

Я не думаю, что вы можете получить которые не позволяют ОС знать, какой порт вы слушаете. Номер порта входящего пакета обычно сравнивается с номером (ами) порта, к которому привязан процесс, чтобы определить, куда должен быть доставлен пакет.

Попробуйте установить фиксированный номер порта (просто выберите случайное 16-разрядное целое без знака, например 49153 или что-то еще) и используя это с обеих сторон.

Вы упоминаете использование Bonjour, которое, как я понимаю, позволяет динамически обнаруживать сетевые ресурсы, но все же я думаю, что это стоит попробовать.