gpt4 book ai didi

ios - GCDAsyncUDPSocket源地址返回null

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:08:50 24 4
gpt4 key购买 nike

谷歌代码问题镜像:https://groups.google.com/forum/#!topic/cocoaasyncsocket/grhjZSMLr3U

这是我读取响应的代码:

- (void)init {
udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

NSError *error = nil;
if (![udpSocket bindToPort:UDP_PORT error:&error]) { //not connecting to host
return;
}
if (![udpSocket beginReceiving:&error]) {
return;
}
}


- (void)udpSocket:(GCDAsyncUdpSocket *)sock
didReceiveData:(NSData *)data
fromAddress:(NSData *)address
withFilterContext:(id)filterContext
{
NSString *msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"got data from broadcast: %@",msg);

NSString *src = [[NSString alloc] initWithData:address encoding:NSUTF8StringEncoding];
NSLog(@"got src from broadcast: %@",src);
}

这是发送 udp bcast 的代码:

- (void)send {
[udpSocket enableBroadcast:YES error:nil];
[udpSocket sendData:[self pack:@"134.71.146.49"] toHost:UDP_BCAST_ADDR port:UDP_PORT withTimeout:-1 tag:UDP_BROADCAST_SEND];
}

port 和 bcast addr 分别是 55555 和 255.255.255.255。

控制台输出:

got data from broadcast: 134.71.146.49
got src from broadcast: (null)

got data from broadcast: 134.71.146.49
got src from broadcast: (null)

十六进制:

 data:     <3133342e 37312e31 34362e34 39>
address: <1002d903 864793dd 00000000 00000000>

为什么这里的源地址是空的?或者为什么格式不正确?

最佳答案

返回给你的地址字段实际上是一个扁平化为NSData对象的sockaddr_in结构。

结构如下:

struct sockaddr_in {
__uint8_t sin_len;
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};

从地址对象的显示可以看出,第一个字段 sin_len 是 0x10,即 16 个字节。这是 sockaddr_in 结构的长度。您可以使用它来判断地址对象是指 IPv4 对象还是 IPv6 对象。 IPv6 对象将使用 sockaddr_in6 结构并具有更长的长度。

您可以将该 NSData 对象复制到 sockaddr_in 结构中,或者只是拉出正确偏移量(4 到 7)处的字节以获得看起来更熟悉的 4 字节源地址。

关于ios - GCDAsyncUDPSocket源地址返回null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14470613/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com