首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用GCDAsyncUdpSocket在局域网中广播?

如何用GCDAsyncUdpSocket在局域网中广播?
EN

Stack Overflow用户
提问于 2013-12-05 03:32:52
回答 2查看 2.5K关注 0票数 3

我想知道是否有一个服务器,它正在监听一个特定的端口,在局域网中的IP地址未知与GCDAsyncUdpSocket。我将在局域网中广播一些消息,如果服务器存在,它将反馈一条消息,然后我将知道服务器的IP地址。

现在,我尝试使用以下代码来完成这项工作:

代码语言:javascript
复制
udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

if (![udpSocket bindToPort:18686 error:&error])
{
    [self logError:FORMAT(@"Error binding: %@", error)];
    return;
}

if (![udpSocket beginReceiving:&error])
{
    [self logError:FORMAT(@"Error receiving: %@", error)];
    return;
}

NSString *host = @"192.168.2.139"; // server IP i know
int port = 8585;
NSString *message = @"Hello";
NSData *data = [msg dataUsingEncoding:NSUTF8StringEncoding];
[udpSocket sendData:data toHost:host port:port withTimeout:-1 tag:tag];

如果我把主机IP设置为服务器IP,它就好了,服务器就会响应。但是我想通过广播来查找服务器IP,我尝试使用"192.168.2.0“、"192.168.2.1”、"192.168.2.255“、"255.255.255.255",所有这些地址都不能广播。

我想知道我可以用哪个IP地址在局域网中广播192.168.2.*,如果不知道LAN IP域,广播的IP地址是什么?任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-05 04:00:12

我检查了GCDAsyncUdpSocket.h并找到了名为- (BOOL)enableBroadcast:(BOOL)flag error:(NSError **)errPtr;的函数,我将以下内容添加到setupSocket中

代码语言:javascript
复制
if (![udpSocket enableBroadcast:YES error:&error]) {
        [self logError:FORMAT(@"Error enableBroadcast:%@",error)];
        return;
}

然后广播作品..。

至于我的问题,我查过192.168.2。*局域网广播IP为192.168.2.255,未知局域网广播IP为255.255.255.255。

我不知道为什么我们需要让GCDAsyncUdpSocket中的广播使用广播IP。希望有一天这会对别人有所帮助。

票数 7
EN

Stack Overflow用户

发布于 2015-02-10 20:58:56

我发现以下代码非常有用,可以为计算机连接到的所有网络生成所有可能的广播地址:

代码语言:javascript
复制
+ (NSDictionary *)allNetworks {
    NSMutableDictionary *networkStates = [NSMutableDictionary new];
    SCDynamicStoreRef storeRef = SCDynamicStoreCreate(NULL, (CFStringRef)@"FindCurrentInterfaceIpMac", NULL, NULL);
    if (storeRef) {
        NSDictionary *interfaceInfo = CFBridgingRelease(SCDynamicStoreCopyValue(storeRef, CFSTR("State:/Network/Interface")));
        NSArray *primaryInterfaces = interfaceInfo[@"Interfaces"];
        for (NSString* interfaceName in primaryInterfaces) {
            NSString *interfaceStateKey = [NSString stringWithFormat:@"State:/Network/Interface/%@/IPv4", interfaceName];
            NSDictionary *ipv4State = CFBridgingRelease(SCDynamicStoreCopyValue(storeRef, (__bridge CFStringRef)interfaceStateKey));
            if (ipv4State != nil) {
                networkStates[interfaceName] = ipv4State;
            }
        }
        CFRelease(storeRef);
    }
    return networkStates;
}

返回的字典将以网络接口名称作为键,而值将是以键@"Addresses“、@"BroadcastAddresses”和@"SubnetMasks“和字符串数组作为值的字典。要将其添加到代码中,您需要包括

代码语言:javascript
复制
#import <SystemConfiguration/SCDynamicStore.h>

并链接到SystemConfiguration.framework。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20390879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档