Cocoa AsyncUDPSocket框架,(长)标签变量解释和我的委托有时只调用

时间:2010-02-11 10:23:15

标签: cocoa sockets asyncsocket

我的第一篇文章也是我的第一个问题。我目前正在使用基于UDP的Artnet protokoll。试图开发一个读取Artnet数据的Cocoa应用程序。我决定使用AsyncUDPSocket Cocoa框架并让它以某种方式工作..所以当我尝试使用

将数据包发送到我的监听端口时
nc -u localhost 6454

我的委托被召唤。如果我尝试使用另一个Artnet应用程序,我的委托永远不会被回调,但我可以看到数据包分析器中的数据包..

我怀疑它必须是由“标签”引起的。有人可以解释(长)标签变量,因为我找不到有关此值的文档,我在网上找不到答案。另外我可能会补充一点,我对可可开发相对较新,所以这可能是一个非常基本的错误..

下面的

是套接字的初始化代码:

 listenSocket_unicast = [[AsyncUdpSocket alloc] initWithDelegate:self];  // This one is not added to the Autorelease pool, so cocoa doesnt delete my socket object.
 listenSocket_broadcast = [[AsyncUdpSocket alloc] initWithDelegate:self];  // This one is not added to the Autorelease pool, so cocoa doesnt delete my socket object.

 // Bind unicast socket..if adress is not the loopback device

 if (![SocketAddress isEqualToString:@LOOPBACK])
 if ([listenSocket_unicast bindToAddress:SocketAddress port:ARTNET_PORT error:nil] == NO)
  {
  NSLog (@"Could not bind unicast socket on Adress %@ and port %i",SocketAddress, ARTNET_PORT);
  return NO;
  }
 else  NSLog (@"Unicast Socket bind to on Adress %@ and port %i",SocketAddress, ARTNET_PORT);
 // Bind broadcast socket..
 if ([listenSocket_broadcast bindToAddress:SocketBroadcastAdress port:ARTNET_PORT error:nil] == NO)
  {
  NSLog (@"Could not bind broadcast socket on Adress %@ and port %i",SocketBroadcastAdress, ARTNET_PORT);
  return NO;
  }
 else
  NSLog (@"Broadcast Socket bind to on Adress %@ and port %i",SocketBroadcastAdress, ARTNET_PORT);




 [listenSocket_unicast receiveWithTimeout:-1 tag:0];
 [listenSocket_broadcast receiveWithTimeout:-1 tag:0];

 [listenSocket_broadcast enableBroadcast:YES error:nil];

和我目前尝试使用的代码:

    -(BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port
{
 [sock receiveWithTimeout:-1 tag:0];
 NSLog (@"UDP Delegate executed");
 return YES;
}

提前致谢,

的Matthias

2 个答案:

答案 0 :(得分:3)

很高兴您发现了问题,但要真正回答有关标记变量的问题,它只是一种跟踪消息的方法。标签不会随消息一起发送,但是当响应发出时,它将具有相同的标记,因此您可以组织它们。如果你不需要做那种事情,只需将标记保留为0,你就可以忽略它。

答案 1 :(得分:0)

问题是我最初没有调用Read方法..因此读数从未开始。