0

我正在使用sendto()recvfrom()通过 WiFI 上的 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);

接收数据包就像:

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
}
4

1 回答 1

0

我认为如果不让操作系统知道您正在收听哪个端口,您就无法接收数据。通常将传入数据包的端口号与进程绑定到的端口号进行比较,以确定需要将数据包传递到何处。

尝试建立一个固定的端口号(只需选择一个随机的 16 位无符号整数,例如 49153 或其他)并在两侧使用它。

您提到使用 Bonjour,我理解它允许动态发现网络资源,但我仍然认为这值得尝试。

于 2009-12-09T16:31:43.660 回答