2009-11-23 105 views
0

我使用sendto()recvfrom()通过WiFI发送一些简单的数据包通过UDP。iphone问题接收UDP数据包

我使用两部手机,以及一个模拟器试过,我得到的结果是:

数据包从手机发送 - >通过模拟器 报文发送模拟器收到 - >模拟器recvfrom的仍然封锁。 从手机发送的数据包 - >其他手机recvfrom仍然阻塞。

我不知道如何开始调试这一个,因为模拟器/ MAC能够接收数据包,但手机似乎没有得到消息。

稍微放一边,我需要保持我的数据包低于我的网络的MTU?还是由操作系统或其他一些较低级别的软件处理碎片?

更新: 我忘了包括数据包大小和结构。我发送:

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

其中char数据[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); 

和recieving分组是这样的:

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,据我了解,它允许动态发现网络资源,但我认为这值得尝试。