2009-11-23 6 views
0

J'utilise sendto() et recvfrom() pour envoyer des paquets simples via UDP sur WiFI.problème d'iphone recevant des paquets UDP

J'ai essayé d'utiliser deux téléphones, et un simulateur, les résultats que je reçois sont:

Les paquets envoyés à partir de téléphones -> recieved par simulateur paquets envoyés par simulateur -> recvfrom simulateur reste de blocage. Les paquets envoyés à partir de téléphones -> autre recvfrom téléphone reste bloqué. Je ne suis pas sûr comment commencer à déboguer celui-ci, puisque le simulateur/mac est capable de recevoir les paquets, mais les téléphones ne semblent pas recevoir le message. Un léger écart, ai-je besoin de garder mes paquets au-dessous du MTU pour mon réseau? Ou la fragmentation est-elle gérée par le système d'exploitation ou un autre logiciel de niveau inférieur?

MISE À JOUR: J'ai oublié d'inclure la taille et la structure des paquets. Je transmets:

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

dont les données char [64] est:

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; 

paquet d'envoi est comme:

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); 

et recieving paquets est comme:

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

Veuillez poster le code. –

+0

Des informations sur les ports que vous utilisez? –

+0

J'utilise bonjour, donc les ports sont "n'importe quel port disponible" – SooDesuNe

Répondre

0

Je ne pense pas que vous pouvez recevoir données sans que le système d'exploitation ne sache quel port vous écoutez. Le numéro de port du paquet entrant est généralement comparé au (x) numéro (s) de port auquel un processus est lié, afin de déterminer où le paquet doit être livré. Essayez d'établir un numéro de port fixe (il suffit de choisir un entier non signé aléatoire de 16 bits, tel que 49153 ou autre) et de l'utiliser des deux côtés.

Vous mentionnez l'utilisation de Bonjour, ce que je comprends permet la découverte dynamique des ressources réseau, mais je pense que cela vaut la peine d'essayer.

Questions connexes