我正在使用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
}
答案 0 :(得分:0)
我不认为您可以在不让操作系统知道您正在收听哪个端口的情况下接收数据。通常将传入数据包的端口号与进程绑定的端口号进行比较,以确定数据包的传输位置。
尝试建立一个固定的端口号(只需选择一个随机的16位无符号整数,例如49153或其他)并在两侧使用它。
你提到使用Bonjour,我理解允许动态发现网络资源,但我认为这值得尝试。