GCDAsyncUdpSocket 和多播发送和接收
Posted
技术标签:
【中文标题】GCDAsyncUdpSocket 和多播发送和接收【英文标题】:GCDAsyncUdpSocket and multicast sending and receiving 【发布时间】:2013-08-09 00:07:10 【问题描述】:在第一种方法中,我创建了基于 sampleProject 的客户端-服务器应用程序,它将一些数据发送到服务器。
Legend:
sender
address = reciver ip
port = reciver port
reciver
address = null since he is listening
port = in my case 55555
工作代码
仅出于公共原因故意跳过错误检查
发件人
-(id*)initForSender:(NSString*)address port:(int)port
self = [super init];
if (self)
_port = port;
_address = address;
tag = 0;
_udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
[_udpSocket bindToPort:0 error:&error];
[_udpSocket beginReceiving:&error];
return self;
-(void)send:(NSData*)data
[_udpSocket sendData:data toHost:_address port:_port withTimeout:-1 tag:tag];
tag++;
接收器/监听器
-(id*)initForReceiver:(NSString*)address port:(int)port
self = [super init];
if (self)
_port = port;
_udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
NSError *error = nil;
[_udpSocket bindToPort:0 error:&error];
[_udpSocket beginReceiving:&error];
return self;
- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data
fromAddress:(NSData *)address
withFilterContext:(id)filterContext
//Do something with receive data
多播
但是我想要客户端,它将发送给许多接收者。我知道 sendre 或 listener 应该使用 [GCDAsyncUdpSocket joinMulticastGroup:error]; 的表单。我运行了 ***、google 叔叔和 CococaAsyncSocket(没有关于 udp 的词),匹配收集到的信息并想出了这段代码。我完全确定,这不起作用,但我不知道为什么。
Legend:
sender
address = sender ip
port = sender port in my case 55555
reciver
address = sender ip
port = sender port in my case 55555
无效的代码
-(id*)initForSender:(NSString*)address port:(int)port
self = [super init];
if (self)
_port = port;
_address = address;
_udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
NSError *error = nil;
[_udpSocket bindToPort:_port error:&error];
[_udpSocket joinMulticastGroup:_address error:&error];
[_udpSocket enableBroadcast:YES error:&error];
return self;
-(void)send:(NSData*)data
[_udpSocket sendData:data toHost:_address port:_port withTimeout:-1 tag:tag];
tag++;
接收器/监听器
-(id*)initForReceiver:(NSString*)address port:(int)port
self = [super init];
if (self)
_port = port;
_address = address;
_udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
NSError *error = nil;
[_udpSocket bindToPort:_port error:&error];
[_udpSocket joinMulticastGroup:_address error:&error];
[_udpSocket beginReceiving:&error])
return self;
- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data
fromAddress:(NSData *)address
withFilterContext:(id)filterContext
//Do something with receive data
更新:
事实证明,当我使用一些未使用的 IP 作为address
例如@“224.0.1.1”时,它会出错,但感觉有点奇怪。我做得对吗?
【问题讨论】:
你犯了很多错误。这是该库的作者提供的 UDP 客户端和服务器示例。 github.com/robbiehanson/CocoaAsyncSocket/tree/master/GCD/Xcode祝你好运! @user523234:我更新了我的问题。用更多数据填充它:)。我熟悉示例,但 udpEchoServer 和 udpEchoClient 是我已经完成的。现在我需要多播。 【参考方案1】:Multicast addresses 是用于多播目的的特殊保留地址。当主机向组播地址(组)发送数据时,所有加入该组的主机都会收到该数据。
任何希望从多播组接收数据的主机都需要加入该组。 GCDAsyncUdpSocket 的三个步骤是:(注意组地址和组端口组合对于所选的多播组必须是唯一的)
[_udpSocket bindToPort:_port error:&error];
[_udpSocket joinMulticastGroup:_address error:&error];
[_udpSocket beginReceiving:&error])
对于发件人,您不需要这两行。
[_udpSocket bindToPort:0 error:&error]; //bindToPort:0 is same as auto-select sender port by default.
[_udpSocket beginReceiving:&error]; //if you don't want to received, no need for this.
将 239.0.0.0-239.255.255.255 用于您的专用本地网络。避免 224... 您可以从上面的链接中了解更多信息。
【讨论】:
所以我的问题是地址错误。 xD以上是关于GCDAsyncUdpSocket 和多播发送和接收的主要内容,如果未能解决你的问题,请参考以下文章